Local Data on the Stack | 지역 변수 저장하는 메모리 공간
프로그래밍 언어에서 함수 호출 시 생성되는 지역 변수들을 저장하는 메모리 공간을 Stack Frame이라고 한다.
- Stack Frame 메모리 공간은 호출된 함수가 종료되면 사라진다.
- Stack Frame 메모리 공간은 호출된 함수의 프레임(Activation Record)이라고 한다.
Memory Layout | 메모리 레이아웃
프로그램이 메모리에 어떻게 배치되는지를 나타낸 표이다.
- Text : 프로그램 코드
- Static data(정적 데이터) : 전역 변수 (ex.상수, c 정적 변수)
- Dynamic data(동적 데이터) : malloc과 같은 함수를 사용하여 동적으로 할당된 메모리를 저장한다.
- Stack : 자동 저장소로 사용되며 지역 변수와 매개 변수를 저장한다.
Character Data | 문자 데이터
ASCII : 128개의 문자를 포함, 95개의 그래픽 문자와 33개의 제어문자가 있다.
Latin-1 : ASCII와 96개의 그래픽 문자를 포함하여 총 256개의 문자를 포함한다.
Unicode : 대부분 세계 알파벳과 기호를 포한하는 32비트 문자 세트이다. (Java, C++, wide characters등에서 사용됨)
UTF-8, UTF-16 : 가변 길이 인코딩이다.
Byte/Halfword Operations | 연산
- 비트 연산 사용 가능
- MIPS Byte/Halfword 로드/스토어는 문자열 처리가 일반적이다.
- lb rt, offset(rs)와 lh rt, offset(rs) : 부호를 32비트로 확장한다.
- lbu rt, offset(rs)와 lhu rt, offset(rs) : 부호를 32비트로 확장하지 않는다.
- sb rt, offset(rs)와 sh rt, offset(rs)는 가장 오른쪽 바이트/하프워드만 저장한다.
(*MIPS의 1word = 4byte = 32bit / halfword = 2byte = 16bit)
String Copy Example | 문자열 복사 예제와 설명, MIPS 명령어 처리과정
void strcpy(char x[], char y[]) {
int i;
i = 0;
while ((x[i] = y[i]) != '\0')
i += 1;
}
#x = $a0, y = $a1, i = $s0
MIPS 명령어 처리 과정
strcpy:
addi $sp, $sp, -4 # adjust stack for 1 item
sw $s0, 0($sp) # save $s0
# $sp를 -4만큼 조정하여 스택을 조정하고 $s0을 저장한다.
add $s0, $zero, $zero # i = 0
# i = 0으로 초기화 하고, 다음 L1 레이블로 이동
L1: add $t1, $s0, $a1 # addr of y[i] in $t1
lbu $t2, 0($t1) # $t2 = y[i]
# $t1에 y[i]의 주소를 저장하고 $t2에 y[i]의 값을 저장한다.
add $t3, $s0, $a0 # addr of x[i] in $t3
sb $t2, 0($t3) # x[i] = y[i]
# $t3에 x[i]의 주소를 저장하고 $t2의 값을 x[i]에 저장한다.
beq $t2, $zero, L2 # exit loop if y[i] == 0
# 만약 y[i] == 0이면 루프를 종료한다.
addi $s0, $s0, 1 # i = i + 1
j L1 # next iteration of loop
# 그렇지 않으면, i = i + 1을 수행하고 L1로 이동하여 다음 반복을 수행한다.
L2: lw $s0, 0($sp) # restore saved $s0
addi $sp, $sp, 4 # pop 1 item from stack
# 루프가 종료되면 저장된 $s0을 복원하고 스택에서 1개의 항목을 pop한 다음 반환한다.
jr $ra # and return