寄存器(内存访问)
廖家龙 用心听,不照做

寄存器(内存访问):

——————————————————
3.1.内存中字的存储
3.2.DS和[address]
3.3.字的传送
3.4.mov、add、sub指令
3.5.数据段
3.6.栈
3.7.CPU提供的栈机制
3.8.栈顶超界的问题
3.9.push、pop指令
3.10.栈段
——————————————————

CPU中,用16位寄存器来存储一个字,高8位存放高位字节,低八位存放低位字节。
在内存中存储时,由于内存单元是字节单位(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中

将起始地址为N的字单元简称为N地址字单元

任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可看成一个地址为N的字单元中的高位字节单元和低位字节单元
——————————

CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成,8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址

可以使用mov指令将一个内存单元中的内容送入一个寄存器中:mov 寄存器名,内存单元地址

“[…]”表示一个内存单元,“[…]”中的0表示内存单元的偏移地址,指令执行时,8086CPU自动取ds中的数据为内存单元的段地址

8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器,所以mov ds,1000H这条指令是非法的
——————————

8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据,也就是说可以一次性传送一个字,只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了

——————————


mov 寄存器,段寄存器
mov 内存单元,段寄存器
mov 段寄存器,内存单元

mov、add、sub是具有两个操作对象的指令,jmp是具有一个操作对象的指令
——————————

我们可以将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段

——————————

栈是一种具有特殊的访问方式的存储空间,最后进入这个空间的数据,最先出去,栈的这种操作规则被称为:LIFO(Last In First Out,后进先出)
——————————

8086CPU提供相关的指令来以栈的方式访问内存空间,这意味着,在基于8086CPU编程的时候,可以将一段内存当作栈来使用:PUSH(入栈)和POP(出栈),8086CPU的入栈和出栈操作都是以字为单位进行的

CS、IP中存放着当前指令的段地址和偏移地址
8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中,任意时刻,SS:SP指向栈顶元素,push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址


——————————————

当栈满的时候再使用push指令入栈,或栈空的时候再使用pop指令出栈,都将发生栈顶越界问题

——————————————

push和pop指令是可以在寄存器和内存之间传送数据的

栈空间也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间



注意:push、pop等栈操作指令,修改的只是SP,也就是说,栈顶的变化范围最大为0~FFFFH

提供SS、SP指示栈顶,改变SP后写内存的入栈指令,读内存后改变SP的出栈指令,这就是8086CPU提供的栈操作机制
—————————————————

在编程时,可以根据需要,将一组内存单元定义为一个段,我们可以将长度为N(N<=64KB)的一组地址连续、起始地址为16的倍数的内存单元,当作栈空间来用,从而定义了一个栈段