寄存器内存访问
1. 内存中字的存储
a) CPU中用16位寄存器来存储一个字,高8位存放高位字节,低8位存放低位字节。由于内存单元是字节单位,则一个字要用两个地址连续的内存单元来存放,低位字节存放低地址单元,高位字节存放高地址单元。
字单元:存放一个字型数据的内存单元,有两个连续的内存单元组成。字单元的地址是低地址单元的地址。如:N号单元和N+1号单元组成一个字单元,那么字单元的地址为N。
2. DS和[address]
CPU要读写一个内存单元必须要先给出这个单元的地址,内存地址由段地址和便宜地址组成,8086中有一个DS寄存器,通常用来存放要访问数据的段地址。
注:不能直接对段寄存器进行修改,需要通过通用寄存器对段寄存器进行修改。
Mov bx,1000H; mov ds,bx;
[address]表示一个内存单元,address中间的表示内存单元的偏移地址。
物理地址=段地址*16+偏移地址,那么{mov 寄存器名,内存单元地址}是如何确定段地址的呢? 指令执行时,8086CPU自动取ds中的数据为内存单元的段地址。
3. mov add sub指令
mov add sub可以操作内存单元和寄存器、寄存器和寄存器之间进行数据交换,但不能直接操作内存单元之间的数据交换,需要通过通用寄存器进行中转。
4. 数据段
在编程时可以根据需要将一组内存单元定义为一个段,可将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存单元当做专门存储数据的内存空间,从而定义了一个数据段。
如何访问定义的数据段呢? 将一段内存当做数据段,是在编程时的一种安排,可以在具体操作的时候使用DS存放数据段的段地址,再根据需要用指令访问数据段中的具体单元。
5. 栈
栈是一种具有特殊的访问方式的存储空间,它的特殊在于最后进入这个空间的数据要最先出来。
6. CPU提供的栈机制
8086提供相关的指令来以栈的方式访问内存空间,这意味着可以将一段内存当做栈来使用。
两个基本指令:PUSH(入栈)/POP(出栈)
Push ax——将ax中的数据送入栈中。
进/出栈都需要使用通用寄存器进行中转。
8086中有两个寄存器,SS、SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。Push和pop指令执行时,CPU从SS和SP中得到栈顶地址。
入栈时是从高地址向低地址方向增长。
任意时刻,SS:SP指向栈顶元素,当栈为空时,栈中没有元素,也就不存在栈顶,所有SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。
7. 栈顶越界的问题
CPU没有记录栈的空间大小,和CS:IP一样,只知道当前栈顶在何处,当前执行的指令是哪条。需要自己注意防止越界。
8. 段的综述
a) 数据段:段地址存放在DS中,用mov add sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当做数据来访问;
b) 代码段:段地址存放在CS中,将段中的第一条指令的偏移地址存放在IP中,CPU执行的是代码段中的指令;
c) 栈段:段地址存放在SS中,将栈顶单元的偏移地址存放在SP中,这样CPU在需要进行栈操作时就将我们定义的栈段稻作栈空间来用。