• RISC-Ⅴ: Control Transfer Operations
프로그램에서 가장 많이 사용되는 기능에는 '조건 검사'가 있다.
조건부 명령어 : Branch
무조건 분기 명령어 : Jump
분기 타겟 (주소) : Label
• Conditional Operation(조건부 명령어)
조건이 참이면, label로 분기된다.
참이 아니면, 다음 명령어 (PC + 4)를 수행한다.
beq : 같으면 L1으로 분기해라.
bne : 같지 않으면 L1으로 분기해라.
blt : 참이면 L1으로 분기해라.
bge : 참이면 L1으로 분기해라.
• Signed vs Unsigned Comparison
Signed comparison : blt(a<b), bge(a>=b)
Unsigned comparison : bltu(a<b), bgeu(a>=b)
• Target Addressing(분기 주소 지정 방식)
타겟 주소는 항상 2-byte alignment 된다.
RISC-Ⅴ의 C extension에서 명령어가 16bits로 encoding 되기 때문이다.
Branch addressing(분기문 주소 지정 방식)
대부분의 분기할 주소는 분기 명령어의 근처에 있다.(if문, for문 등)
Target address = PC + SignExt(12-bit immediate value << 1)
Jump addressing(Jump문 주소 지정 방식)
Target address = PC + SignExt(20-bit immediate value << 1)
Long Jump
더 긴 점프에는 32-bit와 같은 큰 범위의 주소를 사용할 수 있다.
• 함수 호출 과정
- 함수 인자를 레지스터에(x10~x17) 저장한다.
- 돌아올 주소(ra)도 레시스터에 저장한다.
- 실행에 필요한 메모리공간을 확보한다.
- 메인함수의 동작을 실행한다.
- a0, a1에 결과값을 저장한다.
- 돌아올 주소로 복귀한다.
위의 모든 과정에 필요한 기계 명령어는 구현되어 있다.
• RISC-Ⅴ Stack
Stack 규칙을 따르는 메모리 영역이다.
자료구조에서 배운 push/pop을 대신 Load/Store 명령어를 사용하여 stack 영역을 접근한다.
Computer Architecture에서는 스택의 형태가 뒤집힌 구조로 나타난다.
sp(Stack Pointer)는 지금 스택의 크기가 얼마인지를 나타낸다.
따라서 sp 레지스터가 가장 낮은 스택 주소를 저장한다.
즉, 스택이 커진다 = sp의 주소가 작아진다 라고 볼 수 있다.
• Jump Instructions
jal (jump and link)
함수 호출 시 레지스터에 다음 명령어 주소를 저장한다.
점프할 타겟 주소(func)로 이동한다.
jalr (jump and link register)
함수종료 후 실행된다.
• Passing Arguments
Argument 중 레지스터에 넣고 난 뒤 남은 Argument는 스택 영역에 역순으로 넣는다.
그러나 스택에 공간을 할당할 경우 성능은 떨어지게 된다.
• Stack Frame
현재 Function이 사용하고 있는 스택의 크기를 계산할 수 있다.
스택에는 argument뿐 아니라 int와 같은 지역변수가 저장된다.
• 레지스터 보존 규칙
호출자를 저장하는 레지스터 (Caller 저장 레지스터)
메인함수가 임시변수들을 호출(call)하기 전에 스택에 저장해야 한다.
이 레지스터의 내용은 호출의 결과로 수정될 수 있다.
호출된 함수가 저장하는 레지스터 (Callee 저장 레지스터)
호출된 함수(callee)가 사용할 임시변수를 저장한다.
반드시 반환(return) 하기 전에 복원해야 한다.
• Non-Leaf Procedures
Non-Leaf Procedure : 다른 Procedure call을 포함하는 Procedure
Leaf Procedure : 더이상의 fuction call이 없는 Procedure
• Array vs Pointers
기계의 입장에서는 While loop과 포인터 중 포인터를 사용하는 것이 처리하기 더 쉽다.
하지만 컴파일러는 똑똑하기 때문에 option을 주면 array로 코드를 짜도 최적화를 진행할 수 있다!
(컴파일러에 의해 포인터를 사용한 코드와 동일하게 동작할 수 있다.)
'CS > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] #8 Processor (0) | 2024.06.03 |
---|---|
[컴퓨터구조] #7 ISA(3) (0) | 2024.04.23 |
[컴퓨터구조] #5 ISA(1) (0) | 2024.04.22 |
[컴퓨터구조] #4 부동소수점 (0) | 2024.04.19 |
[컴퓨터구조] #3 정수표현법 (0) | 2024.04.15 |