2017-10-10 11 views
-2

그래서 2 개의 레지스터가 있습니다. eax에는 0xDEADC0DE가 있고 ebx에는 0x1337CA5E가 저장되어 있습니다.어셈블리 SF 플래그

첫 번째 숫자가 두 번째 숫자보다 큽니다. 그러나 cmp 지침 후 cmp eax, ebxSF (부호 플래그)이 설정됩니다. 왜 ?

결과가 양수이면 (eax - ebx) 이유는 무엇입니까?

+2

부호 플래그는 결과가 * 음수 * * 양수가 아니라는 것을 나타냅니다. * 실제로 0xdeadc0de - 0x1337ca5e에는 부호 비트가 설정되어 있습니다. 귀하의 질문은 무엇인가? – fuz

+2

부호 비교는 부호 비교에서 사용합니다.이 경우 '0xdeadc0de'는 음수이므로 두 번째 피연산자보다 작습니다 (오버플로 플래그도 확인해야 함). 부호없는 비교의 경우 0 인 캐리 플래그를 확인하십시오. – Jester

+2

아마도 어셈블리 디버거가 레지스터 값을 표시하는 방법의 희생자 일 수 있습니다. 항상 부호없는 값을 16 진수로 표시합니다. 그러나 서명 된 플래그에 관심이 있으면 2의 보수 값을 해석해야합니다. 0xdeadc0de에는 부호가 표시된 비트가 켜져 있습니다. 따라서 음수 인 -559038242 (십진수)입니다. 0x1337ca5e에는 상위 비트가 설정되어 있지 않으므로 양수입니다. 음수 값은 항상 양수 값보다 작습니다. -559038242는 322423390보다 작습니다. –

답변

2

cmpsub을 수행하지만 결과는 유지되지 않습니다. 당신이 볼 수 있듯이

OF (overflow) : did bit 31 change  -> no 
SF (sign)  : is bit 31 set   -> yes 
CF (carry) : is abs(ebx) < abs(eax) -> no 
ZF (zero)  : is result zero   -> no 
PF (parity) : is parity of LSB even -> no (archaic) 
AF (Adjust) : overflow in bits-> archaic, for BCD only. 

이 결과는 31 비트 설정을 가지고 있으며, 따라서는 부정적인 다음과 같이

reg  hex value binary value  

eax = 0xdeadc0de ‭11011110101011011100000011011110‬ 
ebx = 0x1337ca5e ‭00010011001101111100101001011110‬ 
    - ---------- 
res 0xCB75F680 11001011011101011111011010000000 

플래그가 설정됩니다

은의 손으로 같은 해 보자.
-3-1 = -4 (여전히 음수)와 같습니다.
EBX > EAX을 확인하기 위해 SF (부호 플래그)을 사용할 수 없습니다. 부호있는 숫자에는 OF (오버플로 플래그)을 사용하고 부호없는 숫자에는 CF (캐리 플래그)을 사용해야합니다.

긍정적 또는 양수, 음수를
CPU는 알 수 없습니다 (또는 관리) 음. 알고있는 유일한 사람은 당신입니다. SFOF을 테스트하면 숫자를 부호로 처리합니다. CF 만 테스트하면 번호가 서명되지 않은 것으로 간주됩니다.
프로세서가 모든 플래그를 즉시 추적 할 수 있도록 도와줍니다. 테스트 할 플래그를 결정하면 그렇게함으로써 숫자를 해석하는 방법을 결정할 수 있습니다.

+0

PF는'cmp' 다음에 0이됩니다. (하위 8 비트는 '1000 0000'= 짝수 비트 세트 = PF = 0) – Ped7g