※ 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일 때, 성립)
'Computer System > System Programming' 카테고리의 다른 글
this->sysp(06). assembly language IV [security_buffer overflow] (0) | 2022.12.26 |
---|---|
this->sysp(05). assembly language III [procedure] ★★★★ (0) | 2022.12.25 |
this->sysp(03). assembly language I [mov] (0) | 2022.12.23 |
this->sysp(02). Data-Floating point [ IEEE floating point ] (0) | 2022.12.22 |
this->sysp(01). Data-Integer, [1 Byte = 8 bits] (0) | 2022.12.21 |