· 목차
- Branch Operations
- Conditional Operation
- Procedure
이번에는 지난 포스팅에 이어서 Branch Operations와 Conditional Operation 그리고
Procedure 에서 일부 기본적인 부분에 대해서 배워보도록 하겠습니다.
Branch Operations
Branch Operation은 C언어에서 조건문과 같이 특정 조건에 따라서 무언가를 수행하고자 할 때 사용합니다.
CBZ (Compare and Branch on Zero) | CBNZ (Compare and Branch on NonZero) |
B |
if (register == 0) | if (register != 0) | unconditional branch |
위의 표에서 정리한 것과 같이 조건에 따라서 분기하는 CBZ와 CBNZ가 있고,
조건없이 무조건 Labeling한 곳으로 분기하는 B 명령어가 있습니다.
해당 명령어를 이용해서 IF statements를 어떻게 수행할 수 있을까요?
if (i == j) f = g+h;
else f = g-h; // f,g,h,i,j stored in x19 ~ x23
예를 들어서 위의 C코드를 수행하고자 한다면 아래와 같이 작성할 수 있습니다.
$SUB\; \text{x}9, \; \text{x}22, \; \text{x}23$
$CBNZ\; \text{x}9, \; ELSE$
$ADD\; \text{x}19, \; \text{x}20, \; \text{x}21$
$B \; EXIT$
$ELSE: \;SUB\; \text{x}19, \; \text{x}20, \; \text{x}21$
$EXIT: \; .....$
또한 LOOP Statements를 수행하는데에 이용할 수도 있습니다.
while (save[i] == k) i += 1;
위의 C코드를 수행하고자 한다면 아래와 같이 작성할 수 있겠죠?
$LOOP: \; LSL \; \text{x}10, \; \text{x}22, \; \#3 \; // \text{x}10=i*8$
$ADD \; \text{x}10, \; \text{x}10, \; \text{x}25 \; // \text{x}10=\&save[i]$
$LDUR\; \text{x}9, \; [\text{x}10, \#0] \; // \text{x}9=save[i]$
$SUB \; \text{x}11, \; \text{x}9, \; \text{x}24 \; // if(save[i]==k)$
$CBNZ \; \text{x}11, \; EXIT \; // if \; false$
$ADDI \; \text{x}22, \; \text{x}22, \; \#1 \; // if \;true$
$B \; LOOP \; // goto \; Loop$
$EXIT: \; ...$
위의 코드에서 LSL(Logical Shift Left)를 사용해서 8바이트를 곱해주는 이유는 LEGv8의 레지스터 크기는
8byte(64bit)으로 표현되기 때문에 다음 register로 넘어가기 위해서 그런 것이라는 것을 아실 것 입니다.
다음으로 Conditional Operation에 대해서 추가적으로 더 배워보도록 하겠습니다.
Conditional Operation
LEGv8에는 특수목적 register에서 PSTATE라는 register가 존재합니다.
N, Z, V, C와 같은 조건 플래그를 포함하고 있습니다. 해당 조건 플래그는 S를 뒤에 붙여서 표현하는 명령어를 통해서
새롭게 계속해서 갱신할 수 있습니다.
PSTATE register에 존재하는 조건 플래그들은 다음과 같은 의미를 갖고 있습니다.
· negative (N): result had 1 in MSB
· zero (Z) : result was 0
· overflow (V): result overflowed
· carry (C): result had carryout from MSB
여기에는 또한 signed인지 unsigned인지에 따라서 서로 다른 명령어를 갖게 됩니다.
물론 eqaul과 not equal에 대해서는 signed와 unsigned에 대해서 서로 구분되는 명령어는 없습니다.
여기서 다음과 같은 명령어가 추가적으로 더 존재합니다.
B.MI (branch on minus: N=1) | B.PL (branch on plus: N=0) |
B.VS (branch on overflow set: V=1) | B.VC(same with V=0) |
if (a > b) a += 1;
또 다른 Conditional Operation을 배웠으니 위와 같은 C언어를 표현하기 더 쉽겠죠?
$SUBS \; \text{x}9 \; \text{x}22 \; \text{x}23$
$B.LTE \; EXIT$
$ADDI \; \text{x}22, \; \text{x22} \; \#1 $
이제 마지막으로 Procedure Calling에 대해서 일부분 배우고 끝내도록 하겠습니다.
Procedure
여기서 부터 조금씩 헷갈리기 때문에, 다음에 procedure part가 완전히 끝나면 완벽하게 정리한 것 또한 올려드릴게요.
우선은 간단하게 정리하고 넘어가겠습니다.
Procedure calling은 프로그램의 흐름을 다른 함수나 루틴으로 이동시키는 과정이며
재사용성과 모듈성을 높일 수 있습니다.
LEGv8에는 Procedure을 위한 Calling Convention(호출규약)이라는 것이 존재합니다.
호출규약은 함수 간의 레지스터 사용 및 스택 관리에 대한 규칙을 정의합니다.
그렇다면 Procedure과 Calling Convention에는 무엇이 있을까요?
LEGv8은 마이크로프로세서에 배웠던 8051과 다르게
PUSH, POP 명령어가 없기 때문에 직접 조정해줘야 하며,
LIFO의 개념이 없기 때문에 stack point를 기준으로 접근해야 합니다.
Procedure call을 사용하기 위해서 이전에 배웠던 Link Register(LR)이 사용됩니다.
해당 register는 복귀 주소를 저장하고 $BL$ 명령어를 통해서 Link Register의 주소를 PC(Program Counter)에
저장할 수 있습니다. 타겟 address로 점프 이전에는 당연히 $BL\; ProcedureLabel$을 통해서
PC + 4한 값을 Link Register에 넣어주게 됩니다.
호출 인자들은 모두 $\text{x}0 \; \text{~} \; \text{x}7$에 저장되게 됩니다.
여기서 궁금한 것은 호출 인자로 다른 register를 사용할 수 있는지에 대한 것들이 궁금하실 것 입니다.
답을 먼저 하자면 물론 사용 가능하지만, caller-svaed register나 callee-saved register를 사용하느냐에 따라서
다른 규약을 따라야 합니다.
$\text{x}9 \; \text{~} \; \text{x}15$ 까지는 caller-saved register의 영역이며,
호출자(caller)가 필요에 따라 이 레지스터들을 사용하고 필요하면 저장 및 복원할 수 있어야 합니다.
callee-saved 레지스터에서는 $\text{x}19 \; \text{~} \; \text{x}28$을 추가적으로 임시 값을 저장하고 사용할 수 있습니다.
callee-saved register의 경우에는 함수 시작 시에 스택에 저장하고, 함수 종료시에 복원해야 합니다.
그렇다면 여기서 caller-saved register 또는 callee-saved register에 대해서 나왔는데,
도대체 caller와 callee는 또 무엇일까요?
위의 그림을 보시면 caller와 callee에 대한 관계를 직관적으로 아실 수 있습니다.
caller가 호출을 하고 callee는 호출된 것이죠?
여기서 caller가 저장하고 보존하도록 신경써야 하는 register가 caller-saved register입니다.
또한 callee는 caller가 어떤 register의 값을 원하는지 모르기 때문에 백업해야 합니다.
이제까지 Procedure의 일부와 calling convention의 일부분을 살펴봤습니다.
다음에는 전체적인 Procedure 와 calling convention에 대해서 정리해서 다시 찾아올게요.
읽어주셔서 감사합니다.
'전자전기공학 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조][CPU의 기본역할 및 성능] (0) | 2024.09.27 |
---|---|
[컴퓨터구조][Arithmetic/Floating point] (10) | 2024.09.25 |
[컴퓨터구조][Procedure] (2) | 2024.09.24 |
[컴퓨터구조][R, D, I - format Instruction and bitwise] (2) | 2024.09.19 |
[컴퓨터구조][기본배경 및 Operand] (4) | 2024.09.17 |