【问题标题】:nasm Intel 64-bit mode: why does 32-bit constant 0xffffffff cause "warning: signed dword value exceeds bounds"nasm Intel 64 位模式:为什么 32 位常量 0xffffffff 会导致“警告:带符号的双字值超出范围”
【发布时间】:2022-11-21 23:00:07
【问题描述】:

在 nasm (2.14.02) 中,这条指令

    add     rbx, 0xffffffff

导致warning: signed dword value exceeds bounds [-w+number-overflow]。我知道 64 位模式下的算术逻辑运算只接受 32 位常量,但 0xffffffff 仍然是 32 位宽。

为什么 nasm 发出警告,为什么它假设持续的?它是否将 32 位 -1 符号扩展为 64 位 -1 (0xffffffffffffffff) 并因此看到溢出? 0x7fffffff 在没有警告的情况下工作。

我能以某种方式说服nasm 这不是有符号常量,而是无符号常量吗?

谢谢你的帮助!

【问题讨论】:

标签: assembly x86-64 nasm


【解决方案1】:

你的理论在某种程度上是正确的,指令增加了符号扩展指定给寄存器的值。所以没有办法对将 0xffffffff 添加到寄存器的指令进行编码。明显的编码实际上会将 0xffffffffffffffff 添加到 rbx,这不是您所请求的,并且与“添加 rbx,-1”相同

无法将值编码到 32 位字段中,导致 0xffffffff 被添加到 rbx。

你需要做这样的事情: -

mov rcx, 0xffffffff     // This will zero extend the value
add rbx, ebx

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 2010-09-06
    • 1970-01-01
    • 2012-02-16
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多