Fra*_* C. 8 assembly x86-64 nasm
"警告:签名的dword立即超出界限"是我现在存在的祸害,因为它似乎不一致或者我只是没有看到明显的事实.
我声明了以下结构:
struc FRTType
.class resq 1 ; Class
.type resq 1 ; Type
endstruc
Run Code Online (Sandbox Code Playgroud)
我有以下分配:
%assign TYPE_SCALAR 0xfffffffffffffff1
%assign INTEGER 0xffffffff1000a8a9
Run Code Online (Sandbox Code Playgroud)
在我的功能中:
cmp qword [rdi+FRTType.class], TYPE_SCALAR ; This works fine
jne .exception
cmp qword [rdi+FRTType.type], INTEGER ; THIS PRODUCES WARNING
Run Code Online (Sandbox Code Playgroud)
我知道我可以mov rax, INTEGER然后做比较,但这似乎不需要,因为第一次比较没有问题.
Mic*_*ael 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
Run Code Online (Sandbox Code Playgroud)