mips관련 질문입니다.
c코드를 mips로 변환하는 문제중에 $fp와 $sp 프레임포인터와 스택포인터, $ra의 자세한 의미를 잘 모르겠어서요;;
아래 mips인스트럭션에서 sp를 왜 52칸 확보한뒤 fp,ra,a0순으로 48부터 채우는지를 모르겠습니다. 그리고 jr $ra 이 인스트럭션이 return값으로 돌아가는 걸로 알고있는데 어떤 리턴값으로
돌아가는지를 모르겠네요ㅜ지금 computer organization&design이 책으로 공부중인데 혹시 도움이 될만한 다른 책이 있다면 추천부탁드려요:)
set_array:addi $sp,$sp,-52 # set_array함수를 위해 스택 포인터를 조정.
sw $fp, 48($sp) # 다음 call 하기 전에 프레임 포인터 저장.
sw $ra, 44($sp) # 다음 call 하기 전에 return address값 저장.
sw $a0, 40($sp) # 변수 num값 저장. (변수 num = $a0)
addi $fp, $sp, 48 # 프레임 포인터 설정.
add $s0, $zero, $zero # i = 0 ($s0 = i)
addi $t0, $zero, 10 # $t0= for문 반복 loop 10회 설정.
loop: sll $t1, $s0, 2 # $t1 = i * 4
add $t2, $sp, $t1 # $t2 = array[i]의 주소 값.
add $a1, $a0, $zero # pass num as parameter
add $s1, $s0, $zero # pass i as parameter
jal compare # compare(num, i)함수를 호출.
sw $v0, 0($t2) # array[i] = compare(num, I) ( 0($t2) = $v0)
addi $s0, $s0, 1 # i++
bne $s0, $t0, loop # loop if i<10
lw $a1, 40($sp) # num값을 다시 레지스터에 저장.
lw $ra, 44($sp) # return address 값을 다시 레지스터에 저장.
lw $fp, 48($sp) # 프레임 포인터 값을 다시 레지스터에 저장.
addi $sp, $sp, 52 # 스택포인터 재설정.
jr $ra # return
compare: addi $sp, $sp, -8 # compare함수를 위해 스택 포인터를 조정.
sw $fp, 4($sp) # 다음 call 하기 전에 프레임 포인터 저장.
sw $ra, 0($sp) # 다음 call 하기 전에 return address값 저장.
addi $fp, $sp, 4 # 프레임 포인터 설정.
jal sub # sub함수 호출.
slt $v0, $v0, $zero # if $v0 >= $zero, return $v0 = 1
slti $v0, $v0, 1
lw $ra, 0($sp) # sub함수 호출하기 전 return 값 재설정.
lw $fp, 4($sp) # sub함수 호출하기 전 프레임 포인터 값 재설정.
addi $sp, $sp, 8 # sub함수 호출하기 전 스택 포인터 값 재설정.
jr $ra # return
sub: sub $v0, $a1, $s1 # return a-b ($v0= $a1 - $s1)
jr $ra # return
jr $ra는 말그대로
jr $ra는 말그대로 $ra에 담긴 주소(즉 리턴주소)로 점프하는 겁니다.
$sp -= 52
해놓고48($sp)
부터 쓰는 이유를 생각해보려면,$sp -= 4
의 경우를 생각해보지요.스택을 4byte 한 셀 확보했다고 치고, 이 확보한 셀의 주소는 4($sp) 일까요 0($sp)일까요.
마찬가지로 52byte를 빼주면(확보하면), 4바이트씩 접근한다고 가정하고 0, 4, ..., 48 해서 13칸을 사용하게 되겠죠.
혹시 왜 0부터 안쓰고 48부터 쓰냐..고 물어보신다면 이건 컴파일러 마음 아니겠어요?
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
댓글 달기