第三章 寄存器(内存访问)
1、任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。
2、8086cpu中有一个DS寄存器,通常用来存放要访问的数据的段地址。
3、DS和[address]:
例:如果我们要读取10000H单元的内容可以用如下的程序段进行:mov bx,1000H mov ds,bx mov al,[0]
上面的三条指令将10000H(1000:0)中的数据读到al中。
mov指令可以将一个内存单元中的内容送入一个寄存器。
mov指令的格式:mov 寄存器名,内存单元地址
“[]”表示一个内存单元,“[0]”中的0表示内存单元的偏移地址。执行指令时,8086cpu自动取DS中的数据为内存单元的段地址。
4、8086cpu不支持将数据直接送入段寄存器的操作。
5、8086cpu是16位结构,有16根数据线,可以一次性传送16位的数据,也就是一次性传送一个字。
6、mov指令的几种形式:
mov 寄存器,数据
mov 寄存器,寄存器
mov寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器
add,sub:
add/sub 寄存器,数据
add/sub 寄存器,寄存器
add/sub 寄存器,内存单元
add/sub 内存单元,寄存器
7、栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于最后进入这个空间的数据最先出去。
8、栈有两个基本的操作:入栈和出栈。
入栈:将一个新的元素放到栈顶。
出栈:从栈顶取出一个元素。
9、现今的cpu中都有栈的设计。8086cpu提供相关的指令以栈的方式访问内存空间。这意味着,我们在基于8086cpu编程的时候,可以将一段内存当做栈来使用。
10、8086cpu提供入栈和出栈的指令:push(入栈)、pop(出栈)。
push ax:将寄存器ax中的数据送入栈中。
pop ax:从栈顶取出数据送入ax。
8086cpu的入栈和出栈操作都是以字为单位进行的。
11、8086cpu中,有两个寄存器:
段寄存器SS:存放栈顶的段地址。
寄存器SP:存放栈顶的偏移地址。
任意时刻,SS:SP指向栈顶元素。
12、push指令的执行过程:
push ax:(1)sp=sp-2 (2)将ax中的内容送入 SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
栈空,SS:SP指向占空间最高地址单元的下一个单元。
执行push ax后,SS:SP指向栈中的第一个元素。
13、pop指令的执行过程:
pop ax:(1)将SSS:SP指向的内存单元处的数据送入ax 中。 (2)SP=SP+2,SS:SP指向当前栈顶下面的单元, 以当前栈顶下面的单元为新的栈顶。(注:原来的数据依 然存在,相当于是复制的过程)
14、当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶越界问题。
15、push和pop指令是可以在寄存器和内存之间传送数据的。
16、栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。
17、push和pop指令的格式(1):
push 寄存器:将一个寄存器中的数据入栈。
pop 寄存器:出栈,用一个寄存器接收出栈的数据。
push和pop指令的格式(2):
push 内存单元:将一个内存单元处的字入栈(栈操作都 是以字为单位)
pop 内存单元:出栈,用一个内存单元接收出栈的数据。
18、数据的段地址:ds;代码的段地址:cs;栈的段地址:ss。
19、push、pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。
20、在8086cpu中,push、pop等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为:0~FFFFH。
21、我们可以将长度为N(N<=64KB)的一组地址连续、其实地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈顶。
22、问:如果我们将10000H~1FFFFH这段空间当作栈顶,初始状态是空的,此时,SS=1000H,SP=?
答:任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=FFFEH。栈为空,就相当于栈中唯一的元素出栈。出栈后,SP=SP+2,SP原来为FFFEH,加2后SP=0。所以,当栈为空的时候,SS=1000H,SP=0。
23、一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么都不是。关键在于cpu中寄存器的设置,即CS、IP、SS、SP、DS的指向。