2009-04-25 9 views
3

우리는 C 식의 등가 을 수행 ADDL 명령어를 사용한다고 가정 "t = A + B"A, B, T 형 INT의 변수 곳는 다음 조건 코드는 다음 C에 따라 설정 될 식 :약 어셈블리 조건 코드 레지스터

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

ZF (t == 0) 제로

SF : OF (t < 0) 음

: (a < 0 == B를 < 0) & & (! t < 0 = A < 0) 부호 오버플

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

  • CF는 캐리 플래그입니다.
  • ZF는 제로 플래그입니다.
  • SF는 부호 플래그입니다.
  • OF가 오버플로 플래그입니다.
C

이들 식은 식 (t < 0)은 SF 플래그를 설정 이유 예 above.for 한 효과를 가질 이유는 파악할 수 없다 ?? t < 0은 true 또는 false입니다 (교과서에서만 이러한 변수의 유형을 말했기 때문에). 그러나 왜 기호 플래그가 설정 되었습니까? 정말 혼란 스럽습니다. 제발 도와주세요. 감사합니다!

+0

당신을위한 약간 도움 : CF는 CarryFlag입니다 ZF는 ZeroFlag SF입니다 SignFlag OF는 OverflowFlag입니다. 모두 추측. 질문에 더 많은 정보를 넣어야합니다. 도대체 당신 텍스트에 대해 무엇입니까? 그것은 지금까지 질문처럼 들리지 않습니다 ... –

+0

적어도 추측없이 대답 할 수있는 사람은 하나도 없습니다 :) –

+0

의견을 주셔서 감사합니다. 분명히 명확한 질문이 아닙니다. 나는 그것을 편집했습니다. :-) – Pwn

답변

1

CPU는 산술 연산을 수행 한 후 해당 플래그를 설정합니다. "C 표현식"이라고하는 것은 실제로 다양한 CPU 플래그가 설정되는 조건에 대한 설명입니다. 예를 들어, 결과가 0이면 0 플래그가 설정됩니다.

SF : 다음

또는 사용자에게 특정 문제를 해결하기 위해, (t는 < 0)

음의 산술 연산의 결과가 부정적이면, CPU가 SF 플래그를 설정 것을 의미한다. 't < 0'은 C 표현식이 아니며 플래그가 설정된시기를 설명합니다.

플래그는 나중에 플래그 값에 조건부로 분기하는 명령어를 사용하여 제어 흐름에 사용할 수 있습니다.

+0

got it .. 감사!:) – Pwn

0

아직 명확한 질문은 아니지만 여기 내가 수집 한 것입니다. 나는 당신이 "왜 SF (Sign Flag)가 t = a + b입니까?"라고 알고 싶다고 생각합니다. 내가 대답 할께.

간단한 대답은 '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) 

당신은 그들이 그때 당신이 1의 보수와의 보수 볼 것을 제안 C에 나타나는 숫자에 표시에 대한 자세한 내용을 알고 싶다면.

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

0

다른 방법입니다. C에서 < 0을 쓸 때 이것은 S 플래그에 조건부 인 분기로 컴파일됩니다 (N은 음수라고도 함). 프로세서에서 S 플래그는 결과의 최상위 비트에서 복사됩니다.

1

CF, ZF, SF 및 OF는 CC (조건 코드) 레지스터 내의 단일 비트입니다. 다른 조건에서 설정되는 다른 비트도 있습니다. CPU가 특정 명령어 (addsub 포함)를 실행할 때마다 연산 결과에 따라 비트를 설정합니다. cmptest 명령어는 각각 suband 명령어와 동일하게 작동하지만 결과가 완전히 삭제된다는 것과 단 하나의 출력 만 조건 플래그임을 의미합니다.

한다고 가정 우리는 다음과 같은 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 ≠ OF 인 경우에만 점프를 수행합니다. 즉, 결과가 음수이고 오버플로가 발생하지 않거나 결과가 양수이고 오버플로가 발생하면 점프합니다. 이는 차이가 오버 플로우 할 때 올바른 결과를 얻는 데 필요합니다 (예 : INT_MININT_MAX과 비교).