2014-03-28 6 views
0
Suppose %eax contains -20 and %ecx contains -30. 
cmpl %eax, %ecx 

이렇게 비교할 때 -30 - (- 20) = -10이므로 서명 된 플래그가 설정됩니다. 음수를 언제 서명/서명으로 해석합니까?IA32에서 cmpl 작업을 수행 할 때 번호가 서명되지 않았거나 서명되어 있는지 어떻게 알 수 있습니까?

Suppose %eax contains -10 and %ecx contains 20. 
cmpl %eax, %ecx 

이 예에서 -10은 큰 부호없는 숫자로 해석되고 캐리 플래그가 설정됩니다. 왜 20 - (- 10) = 30으로 해석되지 않고 플래그가 설정되지 않았습니까?

+0

'cmpl '뒤에 플래그를 사용하는 명령문 (보통 조건부 브랜치)을 살펴 봐야합니다. – starblue

답변

3

그건 의미가 없습니다. 당신은 32 비트를 가지고 있습니다. 그들은 부호가 없거나 부호가 없으며, 실제로는 숫자입니다. 그것은 그저 당신의 해석 일뿐입니다.

cmp 모든 ALU 동작처럼, (서명으로해서 해석 할 때 유용하다) 캐리 플래그를 포함 모든 플래그를 (동시에 서명하고 서명으로서 효과적으로 수 해석) 설정 오버플로 플래그 (숫자를 부호로 해석 할 때 유용함) 및 부호 플래그 (결과의 맨 위 비트의 사본)입니다.

-10 큰 부호없는 번호 (4294967286)는 실제로 다른 것들이 아닙니다. 비트 패턴 FFFFFFF6를 보는 두 가지 방법 일뿐입니다.

+0

감사합니다. 지금은 이해합니다. 따라서 일반적으로 어떤 플래그가 설정되어 있는지를 파악할 때 서명되지 않은 서명 된 서명으로 해석합니다. – MeesterMarcus

1

플래그로 어떤 일이 벌어지고 있는지 기억하는 것이 좋습니다. 그러나 jge, jle, jg, gl은 부호가있는 비교를 사용하고 ja, jae, jb, jbe는 부호가없는 비교를 사용한다는 것을 기억할 수 있습니다. 그래서 기본적으로

, 당신은 서명되지 않은 비교를 위해 다음을 수행 할 수 :

cmp ecx,eax 
ja some_label ; Jump if ecx > eax (unsigned) 

그리고 서명 비교를 해롤드 당신이 CMP 명령을 사용할 때, 모든 플래그가 변경 말했듯이

cmp ecx,eax 
jg some_label ; Jump if ecx > eax (signed). 

(특히 : 사인 플래그, 오버 플로우 플래그, 제로 플래그 및 캐리 플래그). 차이점을 만드는 플래그에 대해 신경을 쓰고 있습니다.