汇编mov类指令中源操作数与目的操作数需同尺寸吗?
x86 mov指令操作数尺寸规则说明
首先明确:所有普通mov类指令(不带零扩展/符号扩展后缀的),源操作数和目的操作数的尺寸必须严格匹配,不存在“仅大尺寸到小尺寸传递才非法”的情况——只要尺寸不匹配,不管是小转大还是大转小,普通mov指令都会报错。
关于movl %eax, %rdx的错误原因
movl是32位宽度的mov指令,它要求操作数必须是32位的:
- 源操作数
%eax是32位寄存器,符合要求; - 但目的操作数
%rdx是64位寄存器,和指令指定的32位尺寸不匹配,这就是非法的核心原因。
如果要把%eax的值放到%rdx里,有两种合法写法:
- 用64位mov指令:
movq %rax, %rdx(%rax是%eax的64位扩展寄存器,源和目的都是64位,尺寸匹配); - 用32位mov指令操作
%rdx的低32位部分:movl %eax, %edx,此时x86-64架构会自动把%rdx的高32位清零,间接实现把32位值放到64位寄存器的效果。
尺寸不匹配的其他非法示例
反过来,大尺寸源到小尺寸目的的普通mov同样非法,比如movq %rax, %eax:movq是64位指令,但%eax是32位寄存器,尺寸不匹配,同样会报错。如果要把64位寄存器的低32位放到32位寄存器里,直接用movl %rax, %eax即可(movl会自动取%rax的低32位),这是合法的,因为此时操作数都是32位尺寸。
总结:普通mov指令的核心要求是指令后缀指定的尺寸,必须和源、目的操作数的尺寸完全一致,任何不匹配的情况都属于非法操作,需要用对应扩展/截断指令或者调整操作数来解决。
内容的提问来源于stack exchange,提问作者staplegun
相关产品推荐
相关产品推荐

