【例1】判断下列指令对错。
1) MOV [DI], [SI]
错 。直接将一个内存内容赋值给另一个。
2) MOV CX, AH
错。注意不要把AH是一个十六进制数(一个立即数),容易看错,只有八位。源操作数和目的操作数长度不等。
3) MOV 20, DL
错。目的操作数不能是立即数。
4) MOV CS,BX
错。给CS用MOV指令。
5) MOV DS, 1000H
错。不能给段寄存器赋值立即数。
6) MOV BL, 7F2H
错。源操作数和目的操作数长度不同。
7) MOV DS, AX
对。
MOV 指令注意事项:
1)MOV指令不破坏源操作数,相当于执行复制操作
2)MOV指令不能将一个存储单元内容直接传送给另一个存储单元(但可以简介传送)
3)目的操作数不能是立即数(常数)
4)不能让立即数为段寄存器赋值
5)目的操作数和源操作数长度应该相等
6)32位指令只有80386之后才能用
7)不能用MOV 给CS赋值(CS和IP存储下一条指令地址)
【例2】把DS:[SI]字单元传送到ES:[DI]字单元。
解:注意这里DS:[SI]和ES:[DI]是内存单元,不是寄存器。由于不能直接将一个存储单元的内容直接送到另一个存储单元,所以使用通用寄存器AX做一个中转。可以由以下两部MOV指令实现:
MOV AX,DS:[SI]
MOV ES:[DI],AX
【例3】系统工作于实地址模式下,假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H, (BX)=0100H, (BP)=0100H, 试指出下列指令源操作数的寻址方式和物理地址。
1) MOV AX, 0BAH
立即数寻址。操作数是立即数。不知道操作数的物理地址。
2) MOV AX, [100H]
直接寻址。操作数在存储单元中,并且这个操作数的地址是立即数。如这个源操作数在地址为100H的存储单元中。20100H。([100H]-->DS:[100H])20100H=2000Hx10H+100H。
3) MOV AX, [BX+SI]
基址变址寻址。操作数在存储单元中,并且这个操作数的地址是基址寄存器内容(一定有)、变址寄存器内容(一定有)和指令中的偏移量(可有也可无)之和。如这个源操作数地址没有指令偏移量。2001AH。([BX+SI]-->DS:[BX+SI])2001AH=2000Hx10H+0100H+00A0H。
4) MOV AX, [BX+SI+5]
基址变址寻址。对比3)这个操作数地址有指令偏移量。201A5H.
5) MOV AX, ES:[BX]
寄存器间接寻址。操作数在存储单元中,并且操作数地址在寄存器当中。如这个是因为[BX]这一步判断为寄存器间接寻址,不用管ES:。21100H。
6) MOV AX, [BP]
寄存器间接寻址。20100H。
7) MOV AX, BP
寄存器寻址。操作数存放在寄存器当中。直接将BP寄存器当中所有内容给了AX,所以没有操作数物理地址。
8) MOV AX, [BX+5]
寄存器相对寻址。操作数在存储单元中,并且操作数的地址是基址寄存器内容(一定有)和指令偏移量之和(一定有)。20105H。