MIPS 어셈블리어로 팩토리얼 함수 계산 과정

 

  • [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: 리턴 주소로 돌아갑니다.

 

함수 호출 시마다 스택에 리턴 주소와 인자를 저장하고 복원한다