mips관련 질문입니다.

chaekyo의 이미지

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

mithrandir의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.