그래서 2 개의 레지스터가 있습니다. eax
에는 0xDEADC0DE가 있고 ebx
에는 0x1337CA5E가 저장되어 있습니다.어셈블리 SF 플래그
첫 번째 숫자가 두 번째 숫자보다 큽니다. 그러나 cmp
지침 후 cmp eax, ebx
SF
(부호 플래그)이 설정됩니다. 왜 ?
결과가 양수이면 (eax
- ebx
) 이유는 무엇입니까?
그래서 2 개의 레지스터가 있습니다. eax
에는 0xDEADC0DE가 있고 ebx
에는 0x1337CA5E가 저장되어 있습니다.어셈블리 SF 플래그
첫 번째 숫자가 두 번째 숫자보다 큽니다. 그러나 cmp
지침 후 cmp eax, ebx
SF
(부호 플래그)이 설정됩니다. 왜 ?
결과가 양수이면 (eax
- ebx
) 이유는 무엇입니까?
cmp
은 sub
을 수행하지만 결과는 유지되지 않습니다. 당신이 볼 수 있듯이
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
플래그가 설정됩니다
은의 손으로 같은 해 보자.EBX > EAX
을 확인하기 위해
SF
(부호 플래그)을 사용할 수 없습니다. 부호있는 숫자에는
OF
(오버플로 플래그)을 사용하고 부호없는 숫자에는
CF
(캐리 플래그)을 사용해야합니다.
긍정적 또는 양수, 음수를
CPU는 알 수 없습니다 (또는 관리) 음. 알고있는 유일한 사람은 당신입니다. SF
및 OF
을 테스트하면 숫자를 부호로 처리합니다. CF
만 테스트하면 번호가 서명되지 않은 것으로 간주됩니다.
프로세서가 모든 플래그를 즉시 추적 할 수 있도록 도와줍니다. 테스트 할 플래그를 결정하면 그렇게함으로써 숫자를 해석하는 방법을 결정할 수 있습니다.
PF는'cmp' 다음에 0이됩니다. (하위 8 비트는 '1000 0000'= 짝수 비트 세트 = PF = 0) – Ped7g
부호 플래그는 결과가 * 음수 * * 양수가 아니라는 것을 나타냅니다. * 실제로 0xdeadc0de - 0x1337ca5e에는 부호 비트가 설정되어 있습니다. 귀하의 질문은 무엇인가? – fuz
부호 비교는 부호 비교에서 사용합니다.이 경우 '0xdeadc0de'는 음수이므로 두 번째 피연산자보다 작습니다 (오버플로 플래그도 확인해야 함). 부호없는 비교의 경우 0 인 캐리 플래그를 확인하십시오. – Jester
아마도 어셈블리 디버거가 레지스터 값을 표시하는 방법의 희생자 일 수 있습니다. 항상 부호없는 값을 16 진수로 표시합니다. 그러나 서명 된 플래그에 관심이 있으면 2의 보수 값을 해석해야합니다. 0xdeadc0de에는 부호가 표시된 비트가 켜져 있습니다. 따라서 음수 인 -559038242 (십진수)입니다. 0x1337ca5e에는 상위 비트가 설정되어 있지 않으므로 양수입니다. 음수 값은 항상 양수 값보다 작습니다. -559038242는 322423390보다 작습니다. –