汇编学习第三天:寄存器(内存访问)
内存中的字存储
- 字单元:存放一个字的内存单元,由0、1两个字节单元组成
- 字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节
- 我们称起始地址为N的字单元简称为N地址字单元
- 任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元
DS和[address]
- 8086CPU不支持将数据直接送入寄存器的操作。
mov、add、sub
- mov、add、sub指令
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
小结
- 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
- 用mov指令访问内存单元,可以再mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
- [address]表示一个偏移地址为address的内存单元。
- 在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
- mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。
- 可以根据自己的猜测,是在Debug中实验指令的心格式。
栈
- 栈由两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈的操作规则称为:LIFO(后进先出)。
CPU提供的栈机制
- 8086CPU提供入栈和出栈指令,最基本的两个是push和pop。
- 8086CPU的入栈和出栈操作都是以字为单位进行的。
- 由相应的寄存器来存放栈顶的地址,8086CPU中,由两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
- SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH处的数据依然存在,但是,它已不在栈中。当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。
栈顶超界的问题
- 我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。
push、pop指令
- push指令的执行步骤:①SP=SP-2;②向SS:SP指向的字单元中送入数据
- pop指令的执行步骤:①从SS:SP指向的字单元中读取数据;②SP=SP+2。
- 8086CPU只记录栈顶,栈空间的大小我们要自己管理。
栈段
- 首先从栈操作指令所完成的功能的角度上来看,push、pop等指令在执行的时候只修改SP,所以栈顶的变化范围是0~FFFFH,从栈空的时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。所以一个栈段的容量最大为64KB。
- 对于数据段,将它的段地址放在DS中;
- 对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中;
- 对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中。
实验2 用机器指令和汇编指令编程
- debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
检测点答案
略。