티스토리 뷰

[MIPS Register]

$0 = Always 0

$at = The Assembler Temporary used by the assembler in expanding pseudo-ops.

$v0, $v1 = 리턴값 저장. 1 word 인 경우 $v0 만 사용. 초과할 경우 $v1 과 나눠서 저장

$a0-$a3 = 함수 인자값 저장. 초과할 경우 스택에 저장

$t0-$t9 = 임시 저장 레지스터

$s0 - $s7 = 저장 용 레지스터 함수 호출 중 불변

$k0, $k1 = 커널에서 사용하는 레지스터

$gp = 전역 포인터 레지스터

$sp = 스택 포인터

$fp = 함수 프레임 포인터 ($s8)

$ra = 서브루틴 호출 시 반환 주소 저장

 

[MIPS 주요 명령어]

addiu [addiu A B C] = [A <- B + C]

sw [sw A B] = [A ->B]

lw [lw A B] = [A <- B]

li(load immediate) [li A B] = [A <- B]

move [move A B] = [A <- B]

la [la A B] = [A <- B’s Addr]

bal [bal function] = function call = jalr

beq [beq A B L] = A B가 같으면 L로 점프

bne [bne A B L] = AB가 다르면 L로 점프

lui [lui A, 0x47] = A 레지스터 상위 2byte0x47 저장

0x90+var_74($fp) 와 같이 괄호가있을 경우 $fp+(0x90+var_74) 와 같은 표현이다.


[MIPS 함수 호출 과정]

$ra caller return address 저장 (마지막 호출 함수의 경우 저장 안할 수 있음)

$a0 ~ $a3 에 인자값 저장 인자가 4개를 초과할 경우 초과한 만큼 스택에 저장

func(param1, param2, param3, param4) 일 경우 $a0 = param1, $a1 = param2, $a2 = param3, $a3 = param4 가 들어간다.

bal, jal, jalr 등 으로 함수 호출

return 값은 $v0 (4byte 초과시 $v1 에 나눠서 저장)

호출시 $ra 값 스택에 백업

$s0 ~ $s7도 필요한 경우 스택에 백업

$s8 레지스터와 $sp에 같은 값이 저장되어 있어서 $s8의 의미를 아직은 잘 모르겠음



addiu   $sp, -0x90

sw      $ra, 0x90+var_4($sp)

sw      $fp, 0x90+var_8($sp)

move    $fp, $sp

 [프롤로그]


move    $sp, $fp

lw      $ra, 0x90+var_4($sp)

lw      $fp, 0x90+var_8($sp)

addiu   $sp, 0x90

jr      $ra

[에필로그]


'# 시스템 해킹 공부중' 카테고리의 다른 글

[MIPS] strcmp  (0) 2018.04.04
Ubuntu MIPS ARM 크로스 컴파일 환경 구성  (0) 2018.03.28
[MIPS] MIPS 기본 내용 정리  (0) 2018.03.28
댓글
댓글쓰기 폼