문제

우리가 사용한다고 가정합니다 addlC 표현식 "t = a+b"의 동등한 것을 수행하는 지시, 여기서 a, b, t는 유형의 변수입니다. int그런 다음 조건부 코드는 다음 C 표현식에 따라 설정됩니다.

CF : (부호없는 t) <(부호없는 a) 부호없는 오버플로

ZF : (t == 0) 0

SF : (t <0) 음성

of : (a <0 == b <0) && (t <0! = a <0) 서명 된 오버플로

컴퓨터 시스템 교과서에서 QUTED.

  • CF는 캐리 플래그입니다.
  • ZF는 제로 플래그입니다.
  • SF는 표시 깃발입니다.
  • 오버플로 플래그입니다.

이 C 표현이 왜 위에서 언급 한 효과가 있는지 알 수 없습니다. 예를 들어, 표현식 (t <0)이 SF 플래그를 설정하는 이유는 무엇입니까? t <0은 true 또는 false입니다 (교과서 가이 변수의 유형 만 알리기 때문에), 왜 사인 플래그가 설정 되었는가? 정말 혼란 스러워요. 도와주세요 .. 감사합니다!

도움이 되었습니까?

해결책

CPU는 산술 작업을 수행 한 후 해당 플래그를 설정합니다. "C Expressions"라고 부르는 것은 실제로 다양한 CPU 플래그가 설정된 조건에 대한 설명입니다. 예를 들어, 결과가 0 인 경우 Zero 플래그가 설정됩니다.

또는 귀하에게 구체적인 질문을 해결하려면 다음과 같습니다.

SF : (t <0) 음성

산술 작동의 결과가 음수 인 경우 CPU는 SF 플래그를 설정합니다. 't <0'은 C 표현이 아닙니다. 플래그가 설정된 시점 만 설명합니다.

플래그는 깃발 값에 조건부로 분기하는 지침을 사용하여 나중에 제어 흐름에 사용할 수 있습니다.

다른 팁

CF, ZF, SF 및 OF는 CC (Condition Code) 레지스터 내에서 단수 비트입니다. 다른 조건 하에서 설정되는 다른 비트도 있습니다. CPU가 특정 지침을 실행할 때마다 (포함 add 그리고 sub), 작동 결과에 따라 비트를 설정합니다. 지시 사항 cmp 그리고 test 동일하게 기능합니다 sub 그리고 and 결과를 완전히 폐기하는 것을 제외하고는 각각 지침을 제외하고 유일한 출력은 조건 플래그입니다.

다음 C 코드가 있다고 가정합니다.

int a, b;
...
a -= b;
if(a < 0)
{
    // stuff...
}

순진한 컴파일러가이를 컴파일 할 수 있습니다.

    ; Suppose a is in the eax register and b is in the edx register
    sub %eax, %edx  ; subtract b from a, store result in a
    cmp $0, %eax    ; compare a to 0
    jl end_of_stuff ; if a < 0, goto end_of_stuff
    ; code for stuff goes here
end_of_stuff:
    ; code after if block goes here

그러나 더 똑똑한 컴파일러는 sub 명령어는 이미 조건 코드를 설정하므로 다음과 같이 컴파일 할 수 있습니다.

    sub %eax, %edx
    jl end_of_stuff   ; if a < 0, goto end_of_stuff
    ; code for stuff goes here
end_of_stuff:
    ; code after if block goes here

주목하십시오 jl 지시 (보다 적은 경우 점프)는 SF ≠ 인 경우에만 점프를 취합니다. 즉, 결과가 음수이고 오버플로가 발생하지 않거나 결과가 양수이고 오버플로가 발생하면 점프됩니다. 이것은 차이가 오버플로 될 때 올바른 결과를 얻는 데 필요합니다 (예 : 비교 INT_MIN ~와 함께 INT_MAX).

여전히 명확한 질문은 아니지만 여기에 내가 얻은 것이 있습니다. 나는 당신이 "내가하는 모든 일이 T = a+b 일 때 사인 플래그 (SF)가 설정되어있는 이유는 무엇입니까?"를 알고 싶다고 생각합니다. 대답하겠습니다.

간단한 대답은 'int'c 유형이 서명되었다는 것입니다. 서명되지 않은 버전을 얻으려면 '부호없는 int'라고 말해야합니다. 따라서 상황 T = A+B에서 이러한 변수는 모두 서명됩니다. 이제 깃발을 설정할 수있는 이유는 다음과 같습니다.

let a = 5, b = -10
t = a+b
t = 5 - 10
t = -5 (SF will be set because of the negative)

let a = 5, b = 10
t = a+b
t = 5 + 10
t = 15 (SF will not be set because of the positive)

C에 나타나는 숫자에 대한 징후에 대해 더 알고 싶다면 보완 및 TWOS 보완을 보는 것이 좋습니다.

나는 그것이 질문에 대답하기를 바랍니다.

다른 방법입니다. C에서 t <0을 쓸 때, 이것은 s 플래그에서 조건부 (종종 n을 음수로라고 함)로 편집됩니다. 프로세서에서 S 플래그는 결과의 가장 높은 비트에서 복사됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top