汇编-3.1-寄存器(内存访问)

1.内存中字的存储
CPU中,用16位寄存器来存放一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字节要用两个地址连续的内存单元来存放,这个字节的低位字节存放在地址单元的低地址单元中,高位字节存放在高地址单元中。
2.字单元
即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址单元中存放字型数据的低位字节。
3.DS和[address]
CPU要读写一个内存单元时,必须先给出这个单元的地址,在8086PC中,内存单元地址由段地址和偏移地址组成。通常由DS寄存器存放要访问数据的段地址。
mov指令:将数据直接传送入寄存器;将一个寄存器中的内容送入另一个寄存器。
“[…]”表示一个内存单元,“[…]”中的0表示内存单元的偏移地址。只有偏移地址时不能定位一个内存单元的。所以执行指令时,CPU自动读取DS中的数据为内存单元的段地址。
4.字的传送
8086CPU是16位结构,所以一次性可以传送16位数据,就是说可以一次性传送一个字。只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了。
5.mov、add、sub指令
mov 寄存器, 数据    如:mov  ax,8
mov 寄存器,寄存器    如:mov  ax,bx
mov 寄存器,内存单元   如:mov  ax,[0]
mov 内存单元, 寄存器  如:mov [0],ax
mov 段寄存器, 寄存器  如:mov ds,ax

add 寄存器,数据    如:add ax,8
add 寄存器,寄存器   如:add ax,bx
add 寄存器,内存单元  如:add ax,[0]
add 内存单元,寄存器  如:add [0],ax
sub 寄存器,数据    如:sub ax,9
sub 寄存器,寄存器   如:sub ax,bx
sub 寄存器,内存单元  如:sub ax,[0]
sub 内存单元,寄存器  如:sub [0],ax
6.数据段
对于8086CPU,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N<=64kb)、地址连续、起始地址为16的倍数的内存单元作为专门存储数据的内存空间。从而定义了一个数据段。
将一段内存当作数据段,是我们在编程时的一种安排,可以在具体操作时,用DS存放数据段的段地址,根据需要,用相关指令访问数据段中的具体单元。
7.栈
栈时一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据最先出去。栈的操作规则被称为:LIFO.
8.CPU提供的栈机制
8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。
CPU有相应的寄存器来存放栈顶的地址,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶地址。
PUSH指令运行过程:
这里写图片描述
POP指令运行过程:
这里写图片描述
8.栈空的情况分析
如果将10000H~1000FH这段空间当作栈,初始状态栈是空的,此时SS=1000H,SP=?
10000H~1000FH这段空间当作栈段,SS=1000H,栈空间的大小为16字节,栈最低部的字节单元地址为1000:000E.任意时刻,SS:SP指向栈顶,当栈中只有一个元素时,SS=1000H,SP=000EH.,栈为空就相当于栈中的唯一元素出栈,出栈后,SP=SP+2,SP原来为000EH,加2后(入栈时,栈顶从高地址向低地址方向增长)SP=10H,所以,当栈为空的时候,SS=1000H,SP=10H.
这里写图片描述
换一个角度来说,任意时刻,SS:SP指向栈元素,当栈为空时,栈中没有元素,也就不存在栈顶元素.所以SS:SP只能指向栈的最底部单元下面的单元,该单元地址偏移为栈最底部的字单元的偏移地址+2,栈最底部地址为1000:000E,所以栈空时,SP=0010H.
9.栈顶超界
如果栈顶超出栈的空间,最的数据会将栈外的数据覆盖,栈可能外的数据可能是其他程序的数据,栈超界会引起一连串的问题.
10.push指令和pop指令
push和pop指令是可以在寄存器和内存(栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间)之间传输数据。
push和pop格式如下:
push 寄存器 ;将一个寄存器中的数据入栈
pop 寄存器 ;出栈,用一个寄存器接收出栈的数据

push 段寄存器 ;将一个段寄存器中的数据入栈
pop 段寄存器 ;出栈,用一个段寄存器接收出栈的数据

push 内存单元 ;将一个内存字单元处的字入栈(栈操作的都是以字为单位)
pop 内存单元 ;出栈,用一个内存字单元接收出栈的数据
12.栈段
在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N<=64kb)、地址连续、起始地址为16的倍数的内存单元作为专门存储数据的内存空间。从而定义了一个数据段。比如,我们将10010H~1001FH这段长度为16字节的内存空间当作栈来使用,以栈的方式进行访问。这段空间就可以称为一个栈段,段地址为1001H,大小为16字节。

猜你喜欢

转载自blog.csdn.net/changjucha3459/article/details/80995654