※ processor 상태

실행되는 cpu의 상태정보를 register에 저장한다.

이때, test 결과를 의미하는 code를 Condition code라 부른다.

 

§ Condition Codes

- 모두 1bit로 0이나 1만 저장되며 flag register라고도 불린다.

- Condition code를 setting, 즉 flag register 값을 바꾸는 방법은 다음과 같다.

 

1. 산술연산 [간접 setting] (단, 이때 leaq명령어로는 값이 바뀌지는 않는다.)

- ex)  addq  Src, Dest  ↔  t = a + b

 

 

2. 비교 명령어 [직접 setting]

cmpq  Src2,  Src1   로 표기하며 이때, Src1 - Src2를 계산하여 비교한다.

(단, Src1 - Src2의 결과를 저장하지는 않는다.)

 

 

3. test 명령어 [직접 setting]

testq  Src2,  Src1   로 표기하며 이때, Src1 & Src2 연산을 진행하여 비교한다.

(단, Src1 & Src2의 결과를 저장하지는 않는다.)

 

 

§ Condition Codes값 읽어오기  (feat.  SetX 명령)

§  SetX  ByteReg 

- cmp 명령 실행 후에 적용된다.

- ByteReg의 하위 byte를  condition code (flag register)의  조합 X에 따라  0이나 1로 설정

- 이때, quad와 같은 경우 ByteReg의 나머지 7 byte는 변경이 없다.

즉, %rsp를 예로 들면 최하위 1byte인 %spl을 이용해 0이나 1로 설정한다.

Q. quad를 예로 들면, 그렇다면 1byte를 제외한 나머지 7byte는 어떻게 해야할까?
A. movzbl을 이용해 mov를 이용해 copy 후 나머지 나머지 7byte는 0으로 padding 해준다.

 

Ex. C code  ->  assembly

int gt (long x, long y) { 
    return x > y;
}

 

 

 

 

 

 

 

※ 점프 (jump)

§  jX  Label 

이때, Label은 assembly에서 위치를 나타내며 특정 label로 jump해서 fetch하게 해주는 것이다.

- 조건코드에 따라서 코드의 실행위치를 이동한다.

 

§ 조건부 분기예제  (Old Style)

long absdiff (long x, long y) {
    long result;
    if (x > y)
        result = x - y;
    else
        result = y - x;
    return result;
}

 

 

§ 조건부 분기예제  (Go to 코드 Style)

 

 

§ 조건부 이동명령  (cmovX)

3항 연산자와 같은 한문장으로 표현 가능한 if-else문에서 사용하는데, 위의 go-to보다 더욱 효율적이다.

- 분기문은 pipe라인의 instruction흐름을 매우 방해하지

- 조건부 이동명령은 제어의 이동이 필요가 없기 때문이다.

 

 

§ 조건문 컴파일  (Do-While  loop)

- 바꾸는 방법: do-while => Go to => assembly

이때, x>>=1의 경우, 등호를 통해 shift결과를 x에 save할 수 있게 된 것이다.

 

 

§ 조건문 컴파일 (While  loop)

- 바꾸는 방법: 조건문 => do-while => Go to => assembly

§ 일반적인 While문의 번역- 1

 

 

§ 일반적인 While문의 번역- 2

 

 

 

 

§ 조건문 컴파일  (for  loop)

- 바꾸는 방법: for => while => do-while => go to => assembly

for (init; test; update)
    Body
    

init;
while (test) {
    Body
    update;
}

 

 

 

 

§ 조건문 컴파일  (switch 문)

long switch_eg (long x, long y, long z) {
    long w = 1;
    switch (x) {
        case 1:
            w = y * z;
            break;
        case 2:
            w = y / z;
            /* Fall through */
        case 3:
            w += z;
            break;
        case 5:
        case 6:
            w -= z;
            break;
        default:
            w = 2;
    }
    return w;
}

§ jump table 구조

 

▶ table 구조

- 각 타겟은 8 byte를 필요로 하며  시작주소는 .L4 이다.

 

▶ jump 하기

▷ 직접 점프: jmp  .L8

- 점프 대상은 레이블 .L8로 표시한다.

 

▷ 간접 점프: jmp  *.L4(, %rdi, 8)

- 점프 테이블의 시작: .L4

- 8 byte 주소이기에 8의 배수로 증가해야 함

- 점프 target 유효주소는 .L4 + x * 8 로부터 얻어진다.  (0 ≤ x ≤ 6일 때, 성립)

 

 

+ Recent posts