在本章中,我们从访问内存的角度继续学习了几个寄存器。我们提出字单元的概念:字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。我们用mov指令在寄存器和内存之间进行字节型数据的传送。因为8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据。也就是说可以一次性传送一个字。只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了。
既然有“mov段寄存器,寄存器”,从寄存器向段寄存器传送数据,那么也应该有“mov寄存器,段寄存器”,从段寄存器向寄存器传送数据。一个合理的设想是:8086CPU内部有寄存器到段寄存器的通路,那么也应该有相反的通路。有了这个推测我们就可以用debug来验证,可以看到执行结果:段寄存器ds中的值送到了寄存器ax中。通过验证我们知道,“mov寄存器,段寄存器”是正确的指令。既然有“mov内存单元,寄存器”,从寄存器向内存单元传送数据,那么也应该有“mov内存单元,段寄存器”,从段寄存器向内存单元传送数据。比如我们可以将段寄存器cs中的内容送入内存10000H处,在debug中进行试验。“mov段寄存器,内存单元”也应该可行,比如我们可以用10000H处存放的字型数据设置ds(即将10000H处存放的字型数据送入ds)。
对于8086PC机,在编程时,可以根据需要,将一组内存单元定义位一个段。我们可以将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。那么如何访问数据段中的数据呢?将一段内存当作数据段,是在编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
综上所述,可以总结以下几点知识。
字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高位地址单元中。用mov指令访问内存单元时,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS存储器中。[address]表示一个偏移地址为address的内存单元。在内存和存储器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。mov、add、sub是具有两个操作对象的指令。jmp是具有操作对象的指令。可以根据自己的推测,在debug中实验指令的新格式。
以下是栈的总结,8086CPU提供了栈操作机制,方案如下。在SS、SP中存放栈顶的段地址和偏移地址:提供入栈和出栈指令,它们根据SS:SP指示的地址,按照栈的方式访问内存单元。push指令的执行步骤:1、SP=SP-2;2、向SS:SP指向的字单元中送入数据。pop指令的执行步骤:1、从SS:SP指向的字单元中读取数据;2、SP=SP+2。任意时刻,SS:SP指向栈顶元素。8086CPU只记录栈顶,栈空间的大小我们要自己管理。用栈来暂存以后需要恢复的寄存器内容时,寄存器出栈的顺序要和入栈的顺序相反。push、pop实质上是一种内存传送指令,需注意他们的灵活运用。栈是一种非常重要的机制,一定要深入理解,并加以灵活运用。
原文地址:https://www.cnblogs.com/shxy0523/p/9926199.html