MOV指令需要注意的 (转)
对于MOV 这个传送指令 有7点规定:
1. 两个操作数的数据类型一定要相同,源操作数是8位那么目的操作数也得是8位的。以此类推 16位 32位也一样。
例如:mov EAX,EAX //正确的
mov EAX,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
那么真的规定 2 4 7 这几个规定,我可以可以用寄存器作为中转来达到传递数值的最终目的。
数据传递示范
我们学习传送指令 中的填充指令 MOVSX 这个指令它的作用是把位数短的源操作数传送给位数长的目的操作数。
指令的格式正确如下:
指令 寄存器 内存地址 //格式1
MOVSX EAX , [0A2B3FO1]
指令 寄存器 寄存器 //格式2
MOVSX EAX , EBX
指令 寄存器 立即数 //格式3
MOVSX EAX , 100H
填充指令功能:

那么填充指令也分:符号填充指令与零填充指令
符号填充指令 = MOVSX
符号填充指令填充方式: 用源操作数的 符合位 来填充 目的操作数的高位数据位。
零填充指令 = MOVZX
零填充指令填充方式:恒用 0 来填充 目的操作数的高位数据位。
下面我举个例子: 假设 8位寄存器 AL = 78H
MOVSX CX,AL
执行这句指令后 CX 的值是多少? 既然MOVSX 是符号填充指令 那么答案将是等于: 0FF78H
而零填充指令
MOVZX CX,AL
执行这句指令后 CX 的值是多少? 既然MOVZX 是零填充指令 那么答案将是等于: 0078H
这样示范我相信大家都能够了解 是吧 O(∩_∩)O
上面2句汇编指令 源操作数 都是完全一样的 都是 AL 寄存器,但因为它们的填充指令方式不同,所以得得结果就不同。
浙公网安备 33010602011771号