728x90
반응형
목차
0. MIPS란?
1. 파일 구조 분석
2. 함수 정리
3. 명령어 정리
참고

0. MIPS란?

1) Million Instructions Per Second, 컴퓨터 분야에서 컴퓨터의 연산 속도를 나타내는 단위

2) Microprocessor without Interlocked Pipeline Stages, MIPS Technologies에서 개발한 RISC 기반의 명령어 집합 체계(컴퓨터 아키텍처)

* CISC: Complex Instruction Set Computer, 연산에 처리되는 복잡한 명령어들을 수백 개 이상 탑재하고 있는 프로세서

* RISC: Reduced Instruction Set Computer, 하나의 명령어 실행으로 간단한 프로세스들을 신속하게 수행

MIPS, ARM

마이크로 프로세서 세계에서 사용할 수 있는 두 가지 ISA (명령어 세트 아키텍처), 레지스터의 한 유형


1. 파일 구조 분석

32bit로 명령어 주소들이 4byte 단위로 떨어진다면 MIPS는 RISC 구조


2. 함수 정리

strcoll() 함수

아래 나열된 것과 같이 관계를 나타내는 값을 리턴함

예제 반환값
strcoll(const char *string1, const char *string2); string1이 string2보다 작음 0보다 작음
string1이 string2와 같음 0
string1이 string2보다 큼 0보다 큼

if ( !strcoll(*a2, "UDP") ) : ① a2가 참조하는 값과 UDP가 같으면 → ② if (!0) 이므로 참 → ③ 다음 if문 수행 (∵ if 0은 거짓)

값이 다르면 result로 a1 반환

atol() 함수

정수 문자로 구성한 문자열, 부호와 정수 문자들을 long 형식 값으로 변환하여 반환함


3. 명령어 정리

어셈블리어 예제 의미
NOP   아무 명령도 수행하지 않는 코드, 명령어 사이의 빈공간을 채워주는 역할
LA la $v0, 0x420000 Load Address, 레지스터 $v0에 0x420000가 가리키는 주소 load
ADDIU addiu A B C B + C의 값을 A에 삽입
BNEZ bnez R, L 레지스터 R이 0이 아니면 L로 점프
LW lw $s3 n($0) $0 주소에 n을 더해 주소가 0000000n인 곳의 데이터를 $s3에 삽입

 

$a1에 aCnc 값 삽입 (∵ $a1 = $v0 + (aCnc - 0x420000) = 0x420000 + (aCnc - 0x420000) = aCnc)

 

[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]

movn [movn A B C] = [if C != 0 then A <- B]

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

lb [lb $a, (0)$s0] = $a 에 byte 단위로 데이터 로드

sb [sb $a, (100)$s0] = *($s0 + 100) 에 $a 저장

jal [jal A] - 다음 명령어의 주소를 $ra에 저장하고, A로 점프

bal [bal function] = function call = jalr

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

beqz [beqz R L] = R이 0이면 L로 점프

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

bnez [bnez R, L] = 레지스터 R이 0이 아니면 L로 점프

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

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

slt [slt rd, rs, rt] = rd <= (rs < rt) ? 1 : 0

sll [sll $a, 1] = $a << 1

 

[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의 의미는 추가 파악이 필요

 

참고

[MIPS] MIPS 기본 내용 정리

IoT 환경을 위협하는 '리눅스 악성코드 Top 5'

 

 

728x90
728x90

+ Recent posts