티스토리 뷰
역시나 시작은
Register
$zero | $0 | 항상 0이 저장되어 있는 Register (수정할 수 없다) |
$at | $1 |
명령어를 수행하는 동안 임시값이 저장되는 Register ( Assembler Temporary Register ) |
$v0, $v1 | $2, $3 | 반환값 Register ($v0은 syscall 호출시 사용된다) |
$a0~$a3 | $4~$7 | 인자 Register (Arguments) |
$t0~$t7 | $8~$15 | 임시 Register (서브루틴 호출시 저장하지 않는다) |
$s0~$s7 | $16~$23 |
저장되는 임시 Register (서브루틴 호출시 저장된다) 함수 호출시 함수 시작부분에서 해당 Register를 Stack에 저장한다. |
$t8, $t9 | $24, $25 | 추가적인 임시 Register |
$k0, $k1 | $26, $27 | 커널 Register |
$gp | $28 | 전역 포인터 Register (용도는....?) |
$sp | $29 | 스택 포인터 Register |
$fp | $30 | 프레임 포인터 Register |
$ra | $31 | 리턴 주소 Register |
$f0~$f31 | $32~$63 | 추가적인 Register이고 이중에 실수 저장을 위한 Register가 존재 |
Instruction
산술연산자
- add / addu $rd, $rs, $rt
- sub / subu $rd, $rs, $rt
- mul / mulu $rd, $rs, $rt
- div / divu $rd, $rs, $rt
( div의 결과는 lo, hi에 몫과 나머지가 저장된다. 이 값을 가져오는 명령어는 mflo, mfhi 이다. )
- and $rd, $rs, $rt
- or $rd, $rs, $rt
- nor $rd, $rs, $rt
- or $rd, $rs, $rt
- addi $rd, $rs, $i
( 상수를 더할경우 사용한다. 단, subi는 존재하지 않는다. addi에 상수를 음수로 사용한다. )
- andi, ori, xori ...
데이터 전송 명령어
- lw (Load Word) : lw $s2, 24($s0)
( 진행방향이 오른쪽에서 왼쪽이라는 것을 반드시 기억하자 )
operand는 ( dst, offset(base) ) 가 된다.
- sw (Store Word) : sw $s2, 24($s0)
( 진행방향이 왼쪽에서 오른쪽이라는 것을 반드시 기억하자 )
operand는 ( src, offset(base) ) 가 된다.
- lb, sb 등의 Data Size에 따른 명령어들이 존재하고, word는 기본적으로 4Byte이다.
- li (Load Immediate) : li $v0, 4
- la (Load Address) : la $v0, [Address]
- move $t0, $t1
( la, li 와 차이점은 move는 Register - Register 이라는 점이다 )
- movn $t0, $zero, $t1
( If $t1 != $zero, then $t0에 $t1을 저장 )
점프명령어
< Jump 명령어 >
- jal [Label] : 다음 명령어 주소를 $ra에 저장하고 [Label]로 점프
( 서브루틴 진입시 사용된다 )
- jr $ra : 단순하게 Register에 저장된 주소로 점프
( 서브루틴의 마지막에 주로 사용된다 )
- j [Label] : 단순하게 [Label]로 점프
< Branch 명령어 >
- bge / bgeu $s, $t, [Label]
- bgez $s, [Label]
( 위와 같은 형태로 bgt, ble, blt 도 존재한다. )
- b [Label]
- beq $s, $t, [Label]
- beqz $s, [Label]
- bne $s, $t, [Label]
- bnez $s, [Label]
Set 명령어
- sge / sgeu $d, $s, $t
: $s >= $t 이면 $d를 1로 셋팅한다. 아니면 0으로 셋팅한다.
( 위와 같은 형태로 sgt, sle, slt 도 존재한다. )
- slti / sltiu $d, $s, imm
- seq $d, $s, $t
- sne $d, $s, $t
'Reversing > Assembly' 카테고리의 다른 글
[MASM] MASM으로 작성한 IAT Hooking을 통한 API Hooking (0) | 2020.04.09 |
---|---|
[Assembly] MIPS로 작성한 Bubble Sort 예제코드 (1) | 2020.04.08 |
[MASM] MASM으로 구현하는 32Bit Trampoline API Hooking (0) | 2020.03.16 |
[MASM] MASM으로 작성한 SetWindowsHookEx을 이용한 DLL Injection. (0) | 2020.03.11 |
[MASM] MASM(Microsoft Assembler) 시작하기 (x32, x64) (0) | 2020.03.10 |