mov指令原则
- 两个操作数(目标操作数和源操作数)的大小必须相同
- 两个操作数不能同时为内存操作数(也就是不能内存 到 内存)
- 指令指针寄存器不能作为目标操作数
64位汇编程序下
32位汇编程序和64位汇编程序都依照上面的规则,语法也相同,但如果如果是将源操作数给一个32位寄存器,那么这个寄存器所在的64位寄存器的高32位会被置0
例如:
;64位汇编程序模板 (Template)
;声明一个ExitProcess函数
ExitProcess PROTO
.data
;在这里声明变量
val1 byte 10h;
val2 word 1100h;
val3 dword 11110000h;
.code
main PROC
;这里写自己的代码
mov rax,0ffffffffffffffffh;
mov eax,val3; 这里是给一个32位寄存器,但是rax的高32位被置0了。
mov ecx,0;
call ExitProcess
main ENDP
END
同时,如果是将源操作数给一个16/8位的寄存器,那么这个寄存器所在的64位寄存器的高48/56位不会置0
例如:
;64位汇编程序模板 (Template)
;声明一个ExitProcess函数
ExitProcess PROTO
.data
;在这里声明变量
val1 byte 10h;
val2 word 1100h;
val3 dword 11110000h;
.code
main PROC
;这里写自己的代码
mov rax,0ffffffffffffffffh;
mov eax,val3; 这里是给一个32位寄存器,但是rax的高32位被置0了。
mov rax,0ffffffffffffffffh;
mov ax,val2; 给一个16位寄存器,rax的高48位没有被置0
mov rax,0ffffffffffffffffh;
mov al,val1; 给一个8位寄存器,rax的高56位没有被置0
mov ecx,0;
call ExitProcess
main ENDP
END
32位汇编程序下
32位汇编程序的MOV指令遵循MOV指令原则,上面展示了64位汇编程序MOV指令的特点,下面将测试32位汇编程序的MOV指令是否也有这些特点。
例:
.stack 4096
;声明一个ExitProcess函数
ExitProcess PROTO, dwExitCode:DWORD
.data
;在这里声明变量
val1 byte 10h;
val2 word 1100h;
val3 dword 11110000h;
.code
main PROC
;这里写自己的代码
mov eax,0ffffffffh;
mov ax,val2; 不会覆盖高16位(高16位不会置0)
mov eax,0ffffffffh;
mov al,val1; 不会覆盖高24位(高24位不会置0)
INVOKE ExitProcess,0
main ENDP
END main
经过测试并不具备64位MOV指令的特点
总结
相同之处:
它们的MOV指令的原则相同。
不同之处:
64位汇编程序对比32位汇编程序有以下不同
- 如果是将源操作数给一个16/8位的寄存器,那么这个寄存器所在的64位寄存器的高48/56位不会置0。
- 如果是将源操作数给一个32位寄存器,那么这个寄存器所在的64位寄存器的高32位会被置0。