MOV指令在32位汇编程序和64位汇编程序下的相同与不同之处

本文详细对比了64位与32位汇编语言中MOV指令的行为差异,特别是在处理不同宽度寄存器时的特殊规则,如在64位下给32位寄存器赋值时高32位会被清零,而16/8位寄存器的高48/56位则不会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mov指令原则

  1. 两个操作数(目标操作数和源操作数)的大小必须相同
  2. 两个操作数不能同时为内存操作数(也就是不能内存 到 内存)
  3. 指令指针寄存器不能作为目标操作数

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位汇编程序有以下不同

  1. 如果是将源操作数给一个16/8位的寄存器,那么这个寄存器所在的64位寄存器的高48/56位不会置0。
  2. 如果是将源操作数给一个32位寄存器,那么这个寄存器所在的64位寄存器的高32位会被置0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值