2016-10-29 9 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

사실, 나는 명백한 사실을 놓쳤습니다. 인텔 지침 안내서에서 "때로는 차에서 나와야합니다"라는 것이 명확합니다. 마이클 감사합니다! –