汇编语言 第三章 寄存器(内存访问)

3.1 内存中字的存储

子单元:存放一个字型数据(16 位)得而内存单元,有两个地址连续的字节单元组成。

以后将起始地址为 N 的子单元简称为 N 地址单元。任何两个地址连续的内存单元,N 单元和 N+1 单元,可以将它们堪称两个内存单元,也可以看成一个地址为 N 的字单元中的高位字节单元和低位字节单元。 ### 3.2 DS 和 [address]

8086CPU 中有一个 DS 寄存器,通常用来存放要访问的段地址。

mov 指令:

  1. 将数据直接送入寄存器;
  2. 将一个寄存器中的内容送入另一个寄存器;
  3. 将一个内存单元的内容送入一个寄存器。mov 寄存器名,内存单元地址

mov al,[0] 。[…] 中的 0 表时内存单元的偏移地址。内存单元的段地址就是 ds 中的数据。

现实中并不允许将数据直接送入段寄存器中的操作,ds 是一个段寄存器。所以要用一个数据进行中转。

3.3 字的传送

3.4 mov、add、sub 指令

可以用 mov 指令从段寄存器向寄存器传送数据:mov ax,ds;

可以用 mov 指令从段寄存器向内存单元传送数据:mov [0],cs;

可以用 mov 指令从内存单元向段寄存器传送数据:mov ds,[0]。

段寄存器不可用于运算指令中。即 add ds,ax 等都是不可以的。

3.5 数据段

我们可以将一组长度为 N(≤64KB)、地址连续、起始地址为 16 的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

(1)[段地址 ds 起始值为 1],2662H,E626H,E626H,2662H,D6E6H,FD48H,2C14H,0,00E6H,0,0026H,001CH;

汇编指令 AX CS IP DS
mov ax,6622H 6622H 2000H 3 1000H
jmp 0ff0:0100 6622H 0ff0 0100 1000H
mov ax,2000H 2000H 0ff0 0103 1000H
mov ds,ax 2000H 0ff0 0105 2000H
mov ax,[0008] C389H 0ff0 0108 2000H
mov ax,[0002] EA66 0ff0 010B 2000H

本质上没有区别,都是二进制数。CS:IP 指向段数据,它就成了程序。运算时,DS 所指的地址信息成了数据。

3.6 栈

在这里,定义栈为:一种具有特出的访问方式的存储空间,即先进后出。

3.7 CPU 提供的栈机制

8086CPU 提供入栈(PUSH)和出栈(POP)指令。push ax 表示将寄存器 ax 中的数据送入栈中,pop ax 表示从栈顶取出数据送入 ax。8086CPU 的入栈和出栈操作都是以字为单位进行的。注意:字型数据用两个单元存放,高地址单元存放高 8 位,低地址单元存放低 8 位。

8086CPU 中,有两个寄存器,段寄存器 SS 和寄存器 SP,栈顶的段地址存放在 SS 中,偏移地址存放在 SP 中。任意时刻,SS:SP 指向栈顶元素。

入栈时,栈顶从高地址向低地址方向增长。

3.8 栈顶超界问题

8086CPU 不保证我们对栈的操作不会超界。需要我们自己操心。

3.9 push、pop 指令

push、pop 只给出内存单元的偏移地址,段地址从 ds 中取得。

3.10 栈段

我们可以将一组长度为 N(≤64KB)、地址连续、起始地址为 16 的倍数的内存单元当作栈空间来使用,从而定义了一个栈段。当然,用 SS:SP 指向我们定义的栈段。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×