"0이 아닌 피연산자에 NEG 명령을 적용하면 항상 캐리 플래그가 설정됩니다."캐리 플래그는 언제 설정 되나요?
Why does substracting 2 from 1 set the carry flag? 00000001 (1) + 11111110 (-2) [in 2-complement form] --------------------- CF:1 11111111 (-1) [ why is the carry flag set here???]
"0이 아닌 피연산자에 NEG 명령을 적용하면 항상 캐리 플래그가 설정됩니다."캐리 플래그는 언제 설정 되나요?
Why does substracting 2 from 1 set the carry flag? 00000001 (1) + 11111110 (-2) [in 2-complement form] --------------------- CF:1 11111111 (-1) [ why is the carry flag set here???]
당신은 SUB 0, a
과 동일하게 NEG a
을 볼 수 있습니다. a
이 0이 아니면 캐리 플래그를 설정합니다 (은 항상이므로 부호없는 오버플로가 발생합니다).
그 이유는 무엇입니까? – user2453180
@ user2453180 : 캐리 플래그의 목적에 대해 잘 알고 있습니까? 당신은 그것이 뺄셈에서 설정되면 언제 익숙한가요? –
'11111111'(8 숫자)이 8 비트 레지스터 안에 들어 가지 않는 이유는 알 수 없습니다. – user2453180
첫째, 우리는 a < b
, a - b
항상 carry(Borrow)을 생산할 수있는시기를 알 수 있습니다.
둘째, x86이 빼기 (carry) 플래그를 반전 한 이유를 알아 보겠습니다.
첫 번째 요점은 인간에게는 너무나 명백하지만 컴퓨터에서는 그렇지 않습니다. (컴퓨터를 a + (~b+1)
으로 바꾸어 계산하려면 a - b
을 대체하십시오.)) 컴퓨터가 빌린 방법을 어떻게 알 수 있습니까? 우리는 시계로 2의 보완을 할 수 있습니다 (시계 방향으로는 원래의 번호를 의미 - a
를 시계 반대 방향으로는 반전을 의미 - ~b+1
). 컴퓨터에 대한 그래서
, 그것은 그 a > b
경우 (공제), a + ~b + 1
가있을 것이다 말할 수를 수행 (그림에서 겹침); a < b
일 경우 a + ~b + 1
은 이 아니고은 캐리 (그림에서 갭)가 있습니다.
결론 :
뺄셈의 경우, 캐리 수단이 없다면 빌려야합니다. 캐리가있는 경우, 캐리 비트를 반전하지 않습니다. 지금까지 내가 시도로, 오버 플로우가없는 그런데
OF
이 때
1 - 2
를 설정되지 않습니다.) 나는 @Oliver가 바로이 시점에서 생각하지 않습니다.
결과가 부호가없는 2 진수로 표현 될 수 없을 때마다 자리 올림 플래그에서 캐리 플래그가 설정됩니다. 부호없는 숫자는 항상 양수로 취급됩니다.
1 - 2
이 결과는 -1
이지만, -1
은 부호없는 8 비트 형식으로 표현 될 수 없으므로, carry 플래그가 설정됩니다.
이 경우는 빼기 알고리즘에 8 비트 결과가 포함되어 있고 결과가 올바른 결과가있는 2 보수 2 진수로 해석 될 수 있더라도 이러한 상황이 발생합니다.
명령어는 2 보수로 해석 될 숫자와 함께 사용됩니다. 명령어는 정확하게 2를 보완하여 부호를 변경하기 때문입니다. 부호는 부호없는 숫자가 아닌 2 보수 숫자의 특성입니다.
NEG n
은 0-n
과 같으며 여기서 부호없는 8 비트 숫자에 맞는 유일한 결과는 00000000
입니다. 다른 결과는 적절한 부호없는 숫자가 아닙니다.
CF 플래그가 정의되는 순간을 읽을 때까지 확실하지 않습니다. 인텔 CPU의 문서 설명서는 말한다 : 어떤 부호 값의 부호가 이성을 상실하지 않고 여전히 (제로가 아닌 경우) 서명을 유지 한 수 있기 때문에
부호로 처리됩니다 것을 부정하기If the result of an arithmetic operation is treated as an unsigned integer,
the CF flag indicates an out-of-range condition
분명히 유효하지 않습니다. 연필과 종이 방법을 사용하더라도 다른 비트 패턴을 무효화 할 때 '연필 carry = 1'과 '연필 carry = 0'은 완벽하지 않습니다. 우리가 플래그 레지스터에 '캐리 플래그'및 NOT '캐리 비트'왜
아마입니다. 다시 캐리 플래그는 특정 비트 수에 대해 피연산자 (unsigned로 취급 됨)에 대한 연산 결과가 허용 된 'unsigned range'를 벗어 났음을 나타냅니다.
당신이 무효화 한 값이 서명 된 것으로 취급되면 - 당신은 오버플로 플래그를 봐야합니다.
여기서 중요한 점은입니다. 'carry FLAG'는 'carry BIT'가 아닙니다. 때로는 항상 같지는 않습니다.
BTW : x86/64 만 그렇게하는 것은 아닙니다. 이것은 Atmel의 AVR과 같은 예입니다. 자신의 매뉴얼 말부터
ARM은 아마 같은 행동을 할 것 :
For a subtraction, including the comparison instruction CMP and the negate
instructions NEGS and NGCS, C is set to 0 if the subtraction produced a
borrow (that is, an unsigned underflow), and to 1 otherwise.
및 일반
, ARM의 문서 콜 캐리 플래그 - 캐리가/이렇게 다시 플래그을 빌려이 을 수행으로 취급되어서는 안 BIT
사양에 나와 있기 때문에. (0에서 1을 뺀 것은 상위 비트에 "차용 (borrow)"을 야기합니다. 차용과 캐리는 같은 점이 다릅니다.) –
캐리 플래그는 연산 결과가 너무 클 때 설정됩니다 사용중인 레지스터에 맞춰야합니다. –
이 경우 너무 큰 이유는 알 수 없습니다. – user2453180