汇编语言(王爽)第三章 寄存器(内存访问)
3.1内存中字的存储
一个字(word)的长度为16位,即2个字节,而内存单元为单字节,所以要存储一个字长的数据,需要两个内存单元,并且字的高位存储在高地址单元,字的低位存储在低地址单元。比如数据:1188H,为16位数据,即一个字长,要将其存储在编号为0000H开始的内存中,那么编号为0000H的内存单元里存放88H,0001H的内存单元里存放11H。
3.2DS和[address]
8086CPU中的DS寄存器通常用来存放要访问的数据的段地址,比如要读取地址为10000H单元的内容,可以用如下代码:
mov bx,1000H
mov ds,bx
mov ax,[0] //这里偏移地址为0,默认段地址在DS寄存器中
注:8086指令集不提供mov ds,直接数的操作方式。
检测点3.1
(1)ax=2662H;bx=E626H;ax=E626H;ax=2662H;bx=D6E6H;ax=FD48H;ax=2C14H;ax=0;ax=00E6H;
bx=0;bx=0026H;ax=000CH;
(2)
指令 执行指令后:CS IP DS AX BX
mov ax,6622H 2000H 0003H 1000H 6622H 0
jmp 0ff0:0100 0ff0H 0100H 1000H 6622H 0
mov ax,2000H 0ff0H 0103H 1000H 2000H 0
mov ds,ax 0ff0H 0105H 2000H 2000H 0
mov ax,[8] 0ff0H 0108H 2000H C389H 0
mov ax,[2] 0ff0H 010BH 2000H EA66H 0
代码和数据在内存中存放均为二进制形式,程序将其看为代码还是数据只取决于如何选用。
3.7CPU提供的栈机制:8086提供的出栈、入栈操作都是以字为单位的。SS:SP永远指向栈顶单元。
对于push操作:先将SP=SP-2;然后将被操作数存放到SS:SP开始的两个内存单元中(因为被操作数为一个字长)。
对于pop操作;先将SS:IP处存放的字放入到pop对象,再将SP=SP+2;使得栈顶更新。
POP/PUSH操作对象可以是寄存器,也可以是段寄存器或内存单元,比如:
push ax/pop ds/push [0011]
3.10栈段:通过SS和SP设定的栈空间称为栈段,栈段最大可以为64KB,取决于SP的取值范围(0000H~FFFFH);若将10000H~1FFFFH当作栈段,初始栈为空,SS=?,SP=?。
分析:1FFFFH>=ss*16+sp>=10000H
则:(1FFFFH-sp)/16>=ss>=(10000H-sp)/16
当sp=0000H时,上式等价于:1FFFH>=ss>=1000H
当sp=ffffH时,上式等价于:1000H>=ss>=0
上面两不等式交集为ss=1000H。
这里其实也很容易看出,只有SS=1000H时,栈的范围才可以取到10000H~1FFFFH中的所有。
下面分析SP,因为栈为空,所以当push操作时,栈顶指向栈底元素;这里栈底元素地址为1000H:FFFEH,即sp=sp-2=fffeH,那么原先的sp=fffe+2=0000H.
检测点3.2
(1)mov ax,2000H
mov ss,ax
mov sp,10H
(2) mov ax,1000H
mov ss,ax
mov sp,0H