1、传送指令MOV(Move Instruction)
传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:
MOV
Reg/Mem, Reg/Mem/Imm
其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。在本网络课件的网页中,都将采用上述缩写,此后不再说明。
指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。
下面列举几组正确的指令例子:
源操作数是寄存器
MOV
CH, AL MOV
BP, SP MOV
ECX, EBX
MOV
DS, AX MOV
[BX], CH MOV
[BX+SI], AX
源操作数是存储单元
MOV
AL, [100H] MOV
BX, ES:[DI] MOV
EDX, [BX]
MOV
BX, VARW MOV
AX, [BX+SI] MOV
CH, [BX+DI+100H]
其中:VARW是字类型内存变量(下同)。
源操作数是立即数
MOV
AL, 89H MOV
BX, -100H MOV
EDX, 12345678H
MOV
VARW, 200H MOV
[BX], 2345H MOV
[BX+DI], 1234H
在汇编语言中,主要的数据传送方式如图5.1所示。虽然一条MOV指令能实现其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。
图5.1 MOV指令数据传送示意图
对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。
1)、两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV
BL, AX等是不正确的;
2)、两个操作数不能同时为段寄存器,如:MOV
ES, DS等;
3)、代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV
CS, AX等不正确,但指令MOV
AX, CS等是正确的;
4)、立即数不能直接传给段寄存器,如:MOV
DS, 100H等;
5)、立即数不能作为目的操作数,如:MOV
100H, AX等;
6)、指令指针IP,不能作为MOV指令的操作数;
7)、两个操作数不能同时为存储单元,如:MOV
VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。
对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。表5.1列举一个可行的解决方案,尽供参考。读者可考虑用其它办法来完成同样的功能。
表5.1 MOV指令的变通方法
功能描述
不正确的指令
可选的解决方法
把DS的值传送给ES
MOV
ES, DS
MOV
AX, DS
MOV
ES, AX
把100H传给DS
MOV
DS, 100H
MOV
AX, 100H
MOV
DS, AX
把字变量VARB的值传送给字变量VARA
MOV
VARA, VARB
MOV
AX, VARB
MOV
VARA, AX
对于情况1:不同位数数据之间的传送问题,在80386及其以后的CPU中,增加一组新的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的部分按指令的规定进行填充。