一.
-
字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。
-
mov al,[0] 中[…]表示一个内存单元,[…]中的0表示内存单元的偏移地址
mov bx,1000H
mov ds,bx
mov al,[0]
表示将1000H(1000:0)中的数据读到al中 -
mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令
二. -
push ax表示将寄存器ax中的数据送入栈中,pop ax 表示从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以字为单位进行的。
-
8086CPU中有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中,任意时刻SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。
-
push ax的执行步骤分为下面两步
(1) . SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
(2) .将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。 -
栈满时使用push指令入栈,或栈空时在使用pop指令出栈,都将发生栈顶超界问题。。在编程时要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多而导致的超界;出栈时也要注意防止栈空的时候继续出栈导致的超界。
-
push 寄存器 ;将一个寄存器中的数据入栈
pop 寄存器;用一个寄存器接收出栈的数据push 段寄存器 ;讲一个段寄存器中的数据入栈
pop 段寄存器;用一个段寄存器接收出栈的数据push 内存单元;将一个内存字单元处的字入栈(栈操作都是以字为单位)
pop 内存单元;用一个内存字单元接收出栈的数据
指令执行时,CPU要知道内存单元的地址,可以再push、pop指令中只给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。
三. -
我们可以用一个段存放数据,将它定义为“数据段”
对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当做数据来访问 -
我们可以用一个段存放代码,将它定义为“代码段”
对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令 -
我们可以用一个段当做栈,将它定义为“栈段”
对于栈段,将它的段地址放在放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如执行push、pop指令等,就将我们定义的栈段当作栈空间来用。 -
一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是,关键在于CPU中寄存器的设置,即CS,IP,SS,SP,DS的指向。