【发布时间】:2019-04-04 11:30:47
【问题描述】:
当我们在汇编中使用 mov 指令时,源操作数和目标操作数必须具有相同的大小。 如果我写:
mov rax, 1
是否根据 rax 寄存器的大小转换了 1 操作数?
例如,如果 rax 是 16 位,我们得到:
0000000000000001
?
【问题讨论】:
-
RAX 是 64 位的。在 64 位模式下,一般来说,立即数是 32 位(符号或零扩展)或 64 位。
-
@MargaretBloom:对于使用窄立即数的操作码,立即数总是符号扩展为操作数大小。至少我想不出它们在哪里是零扩展的。如果你想要零扩展,你必须使用
mov eax, imm32,它具有 32 位操作数大小并遵循写一个 32 位寄存器零扩展以填充 64 位寄存器的通常规则。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?。 (我假设这就是你的意思,但如果我们考虑更窄的操作数大小,那么 16 位和 8 位是 -
有特定指令
movabs rax,<64b immediate>将包含编码值“1”作为 64b 整数,但常见的现代汇编器 NASM 将例如mov rax,1汇编成指令mov eax,1与 32b 立即数(机器代码b8 01 00 00 00),它将以完全相同的方式设置最终的rax内容,但编码要短得多。 .. 无论如何,如果指令将rax作为目标寄存器,那么您可以打赌,无论进行什么操作,都会以整个 64 位目标寄存器为目标。如何/是否扩展操作数取决于特定的指令和操作数。 -
@PeterCordes FASM 似乎可以做到,让我看看能不能拿到一份 MASM。
-
不,抱歉@Peter,FASM 不这样做,但 MASM 可以。