NASM是不一致还是我只是错过了即时CMP的明显事实?

时间:2016-10-29 10:09:58

标签: assembly nasm x86-64

“警告:签名dword立即超出限制”是我现有的 bane ,因为它似乎不一致或我只是没有看到明显的事实。

我声明了以下结构:

struc   FRTType        
        .class    resq  1   ; Class
        .type     resq  1   ; Type
endstruc 

我有以下分配:

%assign TYPE_SCALAR     0xfffffffffffffff1
%assign INTEGER         0xffffffff1000a8a9

在我的一个功能中:

cmp     qword [rdi+FRTType.class], TYPE_SCALAR  ; This works fine
jne     .exception
cmp     qword [rdi+FRTType.type], INTEGER       ; THIS PRODUCES WARNING

我知道我可以mov rax, INTEGER然后进行比较,但这似乎不需要,因为第一次比较没有问题。

1 个答案:

答案 0 :(得分:10)

没有CMP r/m64,imm64CMP r/m64,imm32,其中imm32符号扩展为64位。哪个适用于0xfffffffffffffff1,因为0xfffffff1符号扩展为64位是0xfffffffffffffff1。但0x1000a8a9符号扩展为64位是0x000000001000a8a9,这与您想要比较的值不同。

你可以克服这个问题,例如首先将立即加载到寄存器中:

mov rax, INTEGER
cmp     qword [rdi+FRTType.type], rax