In Computer/컴퓨터구조

[컴퓨터 구조] Local Data on the Stack | 지역 변수 저장하는 메모리 공간

팽이리 2023. 5. 9. 21:43

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