Ral*_*alf 4 assembly x86-64 nasm immediate-operand
在 NASM (2.14.02) 中,指令add rbx, 0xffffffff导致
警告:有符号双字值超出界限 [-w+number-overflow]
我知道 64 位模式下的算术逻辑运算仅接受 32 位常量,但 0xffffffff 仍然是 32 位宽。
为什么 NASM 发出警告,为什么它假设一个有符号常量?它是否将 32 位符号扩展-1为 64 位-1(0xffffffffffffffff)并因此出现溢出?0x7fffffff 工作时不会发出警告。
我能以某种方式说服 NASM 这不是一个有符号常量,而是一个无符号常量吗?
0x00000000FFFFFFFF 无法编码为 32 位符号扩展立即数,并且当 x86 立即数比操作数大小窄时,它们始终是符号扩展的。
您的理论有些正确,指令将指定的值添加到寄存器中。无法对将 0xffffffff 添加到寄存器的指令进行编码,因为将立即数写入 64 位寄存器的唯一可用编码是或。只有一种特殊编码addadd r/m64, sign_extended_imm32add r/m64, sign_extended_imm8mov(带有寄存器目标)可以使用 64 位立即数。
明显的编码(填充0xffffffff到imm32)实际上会将 0xffffffffffffffff 添加到 rbx 中,这不是您所要求的,并且与add rbx, -1
无法将值编码到 32 位字段中,从而导致将 0x00000000ffffffff 添加到 rbx。Asm 源使用值,而不是立即数的位模式。
你需要做这样的事情:-
mov rcx, 0xffffffff ; RCX = 0xFFFFFFFF = 0x00000000FFFFFFFF
add rbx, rcx
Run Code Online (Sandbox Code Playgroud)
mov ecx, 0xffffffff也会以同样的方式设置RCX;NASM 将为您优化为高效的 5 字节指令(在写入 32 位寄存器时隐式零扩展为 64 位),而不是需要带有 64 位立即数的 10 字节指令;有关机器代码中不同形式的 MOV 的更多信息,请参阅另一个问答。
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |