- [0]: fact 함수 시작: fact라는 레이블로 함수가 시작됩니다.
- [0] addi $sp, $sp, -8: 스택 포인터 $sp를 8만큼 감소시켜 스택 공간을 할당합니다.
- [4] sw $ra, 4($sp): 스택에 $ra(리턴 주소)를 저장합니다.
- [8] sw $a0, 0($sp): 스택에 인자 $a0를 저장합니다.
- [16] slti $t0, $a0, 1: $a0가 1보다 작은지 비교하여 $t0에 저장합니다.
- [20] beq $t0, $zero, L1: 만약 $t0가 0이면 (즉, $a0가 1보다 크거나 같으면) L1으로 분기합니다.
- [24] addi $v0, $zero, 1: $v0에 1을 저장하여 반환할 준비를 합니다.
- [28] addi $sp, $sp, 8: 스택을 다시 복원합니다.
- [32] jr $ra: 리턴 주소로 돌아갑니다.
- L1에서의 재귀 처리:
- [34] li $a0, $a0, -1: $a0에서 1을 뺍니다.
- [40] jal fact: 재귀적으로 fact 함수를 호출합니다.
- [44] lw $a0, 0($sp): 스택에서 $a0를 복원합니다.
- [48] lw $ra, 4($sp): 스택에서 리턴 주소를 복원합니다.
- [52] addi $sp, $sp, 8: 스택 포인터를 복원합니다.
- [56] mul $v0, $a0, $v0: 팩토리얼 값을 계산합니다.
- [60] jr $ra: 리턴 주소로 돌아갑니다.
함수 호출 시마다 스택에 리턴 주소와 인자를 저장하고 복원한다
'그때 그때 메모' 카테고리의 다른 글
g) 순수 가상함수랑 그냥 가상함수랑 차이 (0) | 2024.09.17 |
---|---|
g) Action Delegate, Invoke() 메서드 (0) | 2024.07.26 |
g) 왜 클래스 이름으로 type을 만들까, static과 매니저 (0) | 2024.07.25 |
리플렉션 (요약) (0) | 2024.07.25 |
g) nullable (0) | 2024.07.25 |