微机原理及应用实验——MOV指令的使用详解
微机原理及应用实验——MOV指令的使用详解
本文详细介绍了MOV指令的使用方法及其在多字节加减法程序中的应用。通过TD调试程序,演示了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
的值了