[英]Is NASM inconsistent or am I just missing an obvious fact with CMP of immediate?
“警告:簽名的dword立即超出界限”是我現在存在的禍害,因為它似乎不一致或者我只是沒有看到明顯的事實。
我聲明了以下結構:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.