微机原理及应用实验——MOV指令的使用详解
MOV指令的使用及多字节加减法程序
前言
本文用到的汇编调试程序为TD.exe,简称TD
具体使用方法请参照:
初识MOV指令
通用数据传送指令包括一般传送指令MOV、堆栈操作指令PUSH和POP、交换指令XCHG、查表转换指令XLAT和字位拓展指令。
通用数据传送指令的执行对标志位不产生影响。
指令格式
MOV dest,src
- 两操作数字长必须相同;
- 两操作数不允许同时为存储器操作数;
- 两操作数不允许同时为段寄存器;
- 在源操作数是立即数时,目标操作数不能是段寄存器;
指令功能
这里的dest表示目标操作数,src表示源操作数。
指令的功能是将一个操作数从源地址传送到目标地址,而源地址中的数据保持不变。
也就是说,MOV指令实际上是完成了一次数据的复制。
MOV指令可实现以下各种传送
注:
- reg:寄存器
- mem:存储器
- sreg :段寄存器
- data :8或16立即数
使用TD进行调试
启动TD(Turbo Debugger)输入程序段,观察执行情况并分析结果:
MOV BL,08H
MOV CL,BL
MOV AX,03FFH
MOV BX,AX
MOV [0200H],BX
MOV ES:[0300H],AX
首先将上面的命令敲到TD程序里:
与我们平常使用的编辑器不太一样:
- 光标(一长条的横杠)在哪里,就在哪里输入指令,直接输入即可
- 运行指令要看指针位置
可以看到,当前的指针ip,其值为0100,这里的0100指的是cs的偏移地址,可以看到,对应着的就是第一行指令
下面我们一步一步地运行上面这6条指令,按F8运行单条指令(运行python程序是F5,我经常会按错。。。)
1.MOV BL,08H
执行这一条语句后,可以看到:
首先,bx的值变了,bh是bx的高8位,bl是bx的低8位
MOV BL,08H
这条指令的意思是将08H这个值赋给bl,即执行该指令后,bx应该变成0008h,结果与上图一致
另外,执行完一条指令后,ip会自动指向下一条指令,该指令的偏移地址为0102h
再来看下一条指令
2.MOV CL,BL
执行该指令后:
MOV CL,BL
该指令的意思是把bl的值赋给cl,由上图可知,cx的低8位和bx的8位是一样的,结果一致
于此同时,ip也指向了下一条指令
3.MOV AX,03FFH
该指令执行后:
MOV AX,03FFH
该指令的意思是把03ffh这个十六进制的值赋给ax,结果与上图一致,ax的值变成了03ff
4.MOV BX,AX
执行该指令后:
MOV BX,AX
该指令的意思是把AX的值赋给BX,如图所示,现在AX,BX的值都是03ff
5.MOV [0200H],BX
MOV [0200H],BX
这条指令的意思是把bx的值赋值到ds:[0200H]这个地址里(基地址默认为ds),先来看看这个地址里原来的值是多少:
可以看到,现在ds:[0200H]里全0,当我们运行这条指令后:
看,03ff这个值就被存到ds:[0200H]里了
如果这样看的不舒服,可以用将byte改成word类型来显示:
6.MOV ES:[0300H],AX
MOV ES:[0300H],AX
这条指令的意思是把AX里的数据送入ES:[0300H]这个地址里
跟上一条指令做一下对比:
MOV [0200H],BX
没有指定基地址时,基地址默认为ds;这里指定了基地址为es,所以我们要去es段找0300h这个偏移地址:
这里可以看到,ds和es的基地址都是一样的,说明他们公用了一个基地址
我们找到0300这个偏移地址,它里面的初始数据也是全0
下面执行一下MOV ES:[0300H],AX这个指令:
可以看到,0300h这个偏移地址里的值也变成ax的值了