Mov 传送指令
能够改变 CS、IP 值的指令称为传送指令
段地址在 8086CPU 的段寄存器中存放。当 8086CPU 要访问内存时,由段寄存器提供的内存单位的段地址。
8086CPU 有 4 个段寄存器,其中 CS 用来存放指令的段地址。
CS 存放指令的段地址,IP 存放指令的偏移地址。
8086 机中,任何时刻,CPU 将 CS:IP 指向的内容当作指令执行。
8086CPU 工作的过程:
① 从 CS:IP 指向的内存读取指令,读取的指令进入指令缓存器。
② IP 指向吓一跳指令;
③ 执行指令。(转到步骤①,重复这个过程)。
Debug 是 DOS、Windows 都提供的实模式(8086 方式)程序的调试工具。使用它,可以查看 CPU 各种寄
存器中的内容、内存的情况和在机器码级跟踪程序的运行。
我们用到的 Debug 的
① R 命令查看、改变 CPU 寄存器的内容。
② D 命令查看内存中的内容
③ E 命令改写内存中的内容
④ U 命令将内存中的机器指令翻译成会汇编指令
⑤ T 命令执行一条机器指令
⑥ A 命令以汇编指令的格式在内存中写入一条机器指令
打开 Debug 调试工具:在 DOS 下输入 C:\>debug
命令:
d 1000:0 可以查看从内存编号 10000 开始的 128 个内存单位的内容
d 1000:0 f 可以查看从内存编号 10000~1000f 的 16 个内存单位的内容
e 1000:0 1 2 3 4 5 … 改变从内存编号 10000 开始的后面 N 个内存单位的内容
e 1000:0 逐个改变从内存编号 10000 开始的后面 N 个内存单位的内容,以空格键确认每个单位,
以回车键结束更改
mov 指令可以完成两种传送:①将数据送入寄存器。②将一个寄存器中的数据送入另一个寄存器。
另外,mov 还可以把数据从内存中送到寄存器上
执行指令时,8086CPU 自动读取 ds 中的值作为内存单位的段地址
Bx=1000H;
Ds=bx;
Mov al,[0]; //代表将 1000:0 的数据写进 AL 中
(注意,8086CPU 不支持直接向数据送入段寄存器中,因此我们通过采取用一个寄存器来中转)
8086CPU 栈顶位置存储在 SS、SP 两个寄存器中,其中 SS 存储的是段地址、SP 储存的是偏移地址
Push ax 的执行,由一下两个步骤完成
① SP=SP-2,SS:SP 指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
② 将 ax 中的内容送入 SS:SP 指向的内存单元处,SS:SP 此时指向新栈顶。
8086 的入栈和出栈都是以字为单位进行的。
Pop ax 的执行过程和 push ax 刚好相反,由一下两步完成。
① 将 SS:SP 指向的内存单元处的数据送入 ax 中;
② SP=SP+2,SS:SP 指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
注意:8086CPU 中没有设立寄存器来管理栈的界限,因此,在编程的时候,我们需要注意栈越界的问
题。换句话说,8086CPU 只知道栈顶的位置,而不知道栈有多大。