2016-10-29 3 views
8

"warning:signed dword immediate bounds"は私の存在のベーンです矛盾しているように見えますが、私は明らかな事実を見ていません。NASMが矛盾しているのですか、または即時のCMPで明らかな事実が欠落していますか?

は、私は次のような構造は、宣言している:

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をすることができます知っているが最初の比較に問題がなければ不要なようです。

答えて

10

CMP r/m64,imm64はありません。
CMP r/m64,imm32があります。imm32は64ビットに符号拡張されています。 が64ビットに符号拡張されているため、0xfffffffffffffff1はうまく動作します。0xfffffffffffffff1です。しかし0x1000a8a9 64ビットに符号拡張されたものは0x000000001000a8a9で、これは比較したい値とは異なります。

あなたはこれを克服することができます。即時にレジスタにロードすることによって:

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

事実、私は明らかな事実を見逃しました。インテルの指示ガイドでは、「時には車から離れる必要がある」ことが明らかです。マイケルありがとう! –

関連する問題