NASM 是不一致的还是我只是遗漏了立即 CMP 的一个明显事实?
Is NASM inconsistent or am I just missing an obvious fact with CMP of immediate?
"warning: signed dword immediate exceeds bounds" 是 我现在存在的祸根 因为它看起来不一致或者我只是没有看到明显的事实。
我声明了以下结构:
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
然后进行比较,但鉴于第一次比较没有问题,这似乎没有必要。
没有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
"warning: signed dword immediate exceeds bounds" 是 我现在存在的祸根 因为它看起来不一致或者我只是没有看到明显的事实。
我声明了以下结构:
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
然后进行比较,但鉴于第一次比较没有问题,这似乎没有必要。
没有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