“警告:签名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
然后进行比较,但这似乎不需要,因为第一次比较没有问题。
答案 0 :(得分:10)
没有CMP r/m64,imm64
有CMP r/m64,imm32
,其中imm32
符号扩展为64位。哪个适用于0xfffffffffffffff1
,因为0xfffffff1
符号扩展为64位是0xfffffffffffffff1
。但0x1000a8a9
符号扩展为64位是0x000000001000a8a9
,这与您想要比较的值不同。
你可以克服这个问题,例如首先将立即加载到寄存器中:
mov rax, INTEGER
cmp qword [rdi+FRTType.type], rax