※ 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일 때, 성립)

 

 

※ switch 문

보통 if문 대신 사용하며 case를 나눌 필요가 있을 때, if-else를 여러번 쓰기 힘들 때 사용한다.

switch (n) // n은 정수형 변수로 전달되는 인자정보, n에 지정된 값에 따라 case 영역 실행
{
    case 'M':
        // 조건 입력
        break;
    case 2:
        // 조건입력
        break;
    default:
        // else문과 비슷한 역할
}

이때, break를 하지 않으면 다음 break가 있는 case문까지 같이 실행되기에 적는 것이 좋다.

§ break와 continue

break: 가장 가까운 반복문을 탈출한다.
continue: 실행위치와 상관없이 반복문의 조건검사위치로 이동한다.
          이때, 이후부터는 continue는 생략하고 재실행한다.

 

 

 

※ while 문 vs for 문

보통 while문은 특정 종료조건이 나타나기 전까지의 지속적인 실행을 위해,

보통 for문은 반복횟수가 정해져 있는 경우에 많이 사용된다.

 

※ 비트 연산자

메모리에 할당된 정수값을 bit단위로 논리연산을 실행하기 위해 사용한다.

 

 

 

 

 

 

 

 

※ 함수 선언

[함수 return 타입] [함수 이름] (인자) {
    /*
     * 
     */
}

인자 (argument): 함수 호출 시 전달되는 "값"

매개변수(parameter): 그런 인자를 받는 "변수"

 

 

 

 

 

 

※ 지역변수와 전역변수, static과 block scope

지역변수(local variable): 중괄호에 의해 형성되는 영역안에 존재, "스택"이라는 메모리 영역에 할당
전역변수(global variable): 초기화를 하지 않으면 0으로 초기화되며 많이 사용하면 효율이 떨어진다.

 

§ 지역변수와 Block Scope

특정함수, 명령문의 블록안에 선언된 변수는 블록범위(Block Scope)밖에서는 사용이 불가능하다!

int a = 1;

{
    a = 2; // a는 2로 초기화 됨
}

{
    int a = 5; // 앞선 a와는 전혀 다른 a
    // Block scope가 끝나면 사라짐
}

{
    a++; // 여기까지 a값은 2, 아래줄 실행 시 a=3으로 증가
}

printf("%d", a); // 3 출력

 

 

§ static: "한 함수 내"에서 "지역변수의 전역변수화"를 해주는 tool

선언된 함수내에서만 접근 가능 (지역변수의 특징)
1회만 초기화, 종료전까지 메모리 공간에 저장 (전역변수 특징)
★ 전역변수와 달리 Block Scope 내부에서만 접근 가능

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts