在汇编中使用mov指令时,源操作数和目标操作数的大小必须相同。 如果我写:
mov rax, 1
转换的1个操作数是否考虑rax寄存器的大小?
例如,如果rax是16位,我们得到:
0000000000000001
?
答案 0 :(得分:4)
有2种语言。第一个是汇编语言,您可能在其中有一个字符串,例如“ mov rax,1”。第二种是机器语言,您将拥有一组字节。
这些语言是相关的,但有所不同。例如,汇编语言中的mov
指令实际上是机器语言中的多个不同操作码(一个用于将字节移入/移出通用寄存器,一个用于将字/双字/ qword移动到通用寄存器,一个用于移双字。 / qwords来控制寄存器,一个用于将dwords / qwords移到调试寄存器,等等)。汇编器使用指令及其操作数来选择适当的操作码(例如,如果您执行mov dr6,eax
,则汇编器将选择用于将dwords / qwords移至调试寄存器的操作码,因为其他操作码都不适合)。>
以相同的方式,操作数可以不同。例如,对于汇编语言,常量1
的类型为“整数”,并且没有任何大小(其大小由使用方式/位置暗示)。但是在机器代码中,必须以某种方式对立即操作数进行编码,并且编码的大小取决于mov
使用的操作码(和前缀)。
例如,如果mov rax,1
转换为字节0x48、0xC7、0xC0、0x01、0x00、0x00、0x00;那么您可以说操作数是“ 64位编码为4个字节(使用符号扩展)”;或者您可以说操作数是用4个字节编码的32位(并且该指令仅将32位移入RAX
,然后符号扩展到RAX的高32位,而不移入任何内容)。即使这些听起来不同(即使大多数人都说后者“更正确”),其行为也完全相同,唯一的区别是机器代码(不是汇编语言的另一种语言)的表述有所不同。描述。在汇编语言中,无论机器语言如何处理,1
仍然是(从上下文中暗示)的64位操作数。