Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

[컴퓨터 구조] Lecture 06: Instructions - Language of the Computer 본문

3학년 1학기 전공/컴퓨터 구조

[컴퓨터 구조] Lecture 06: Instructions - Language of the Computer

시데브 2024. 4. 4. 19:20
경희대학교 컴퓨터공학부 김정욱 교수님의 컴퓨터 구조 강의 내용을 기반으로 한 정리글

 

Explanation of 32 Registers

  • $zero: contains 0 value
  • $a0 ~ $a3: function argument
  • $v0, $v1: return values
  • $t0 ~ $t9: temporary register
  • $s0 ~ $s7: saved registers(preserve)
  • $gp: global pointer (정적 데이터 접근, const value같은)
  • $sp: stack pointer (stack에서 현위치)
  • $fp: frame pointer (stack의 first item을 point)
  • $ra: 이전 함수의 주소를 저장

 

Supporting Procedures in Computer Hardware

  • Procdedure(=Function): 코드 재사용을 더 쉽게 만들어주는 도구
  • another procedure로 jump하기 전에 previous values를 저장해야 한다.

  • 컴파일러는 상황에 따라, 4개의 argument regs($a)와 2개의 return value regs($v)보다 더 많은 레지스터를 필요로 할 때가 있다.
  • callee procedure를 수행할 때, register에 저장된 값이 사라질 수 있음 -> callee procedure를 마치고 caller procedure로 복귀할 때 다시 활용하게 될 수 있는 변수 값을 memory에 미리 저장

-> memory는 reverse(역방향) stack이라 생각하면 됨

 

  • Stack pointer($sp) register: 스택에서 가장 가장 최근에 할당된 주소를 가리킴
위 상황에서 x: $s0, y: $s1일 때,

1. $s0와 $s1을 memory stack에 저장 -> s0, s1 are free
2. callee procedure를 처리
3. caller procedure로 복귀
4. memory stack에 pop 연산으로 restore

leaf_example:
    addi $sp, $sp, -4	#한 칸의 스택 공간 이용
    sw $s0, 0($sp)	#$s0의 값을 메모리에 저장
    
    add $t0, $a0, $a1	#g + h
    add $t1, $a2, $a3	#i + j
    sub $s0, $t0, $t1	#(g + h) - (i + j)
    
    add $v0, $s0, $zero	#$v0 = $s0 + 0
    lw $s0, 0($sp)	#restore
    
    addi $sp, $sp, 4	#sp원위치
    
    jr $ra	#$ra: previous function의 주소를 저장한 reg

 

Nested Procedures

fact:
    addi $sp, $sp, -8
    sw $ra, 4($sp)
    sw $a0, 0($sp)	#돌아갈 return address와 argument n 저장
    
    slti $t0, $a0, 1	#a0가 1보다 작으면 t0는 true(1)
    beq $t0, $0, L1		#t0가 0이면(false면) else로 jump
    
    addi $v0, $0, 1
    addi $sp, $sp, 8
    jr $ra
L1: addi $a0, $a0, -1	#fact(n - 1) 수행을 위해 argument 수정 후 
    jal fact			#fact에 집어넣어, 대신 return address는 남겨놓고
    
    lw $a0, 0($sp)	#calle(fact(n - 1))에 들어가면서 메모리에 저장해놓은 caller(fact(n))의 값들을 restore
    lw $ra, 4($sp)
    addi $sp, $sp, 8	#최초 caller(fact(n))의 값을 저장해놓은 위치로 sp이동
    
    mul $v0, $a0, $v0	#return
    jr $ra	#previous func으로 복귀

 

Allocating Space for New Data on the Stack

  • Frame Pointer: procedure frame의 첫 단어 point
  • Stack Pointer: procedure 과정에서 바뀔 수 있음
  • argument, ra, saved, local arrays and structures

 

Allocating Space for New Data on the Heap

  • Heap: procedure의 변수를 동적으로 저장

  • Text:우리가 실행할 프로그램의 코드가 저장되는 영역
  • Data: 우리가 작성한 전역변수, 정적변수가 저장되는 영역, $gp(global pointer): gp로부터 16bit offset으로 static data에 접근
  • Dynamic Data: 사용자가 할당하는 메모리의 공간 -> 실제 프로그램이 동작할 때(run time) 크기가 결정된다.
  • Stack: 함수 호출 시 생성되는 지역변수, 매개변수의 공간 -> 설계자가 코드를 짜고 compile하는 단계(compile time)에서 크기가 결정된다.

 

MIPS Addressing for 32-bit Immediate and Address

  • I-format에서 immediate 파트에 16비트만 저장됨, 하지만 ALU에서는 32비트 레지스터끼리의 연산만 가능
  • How? -> lui(Load upper immediate)ori(Or immediate)를 통해!
lui $s0, 61		# 0000 0000 0011 1101 0000 0000 0000 0000
ori $s0, $s0, 2304	# 0000 0000 0011 1101 0000 1001 0000 0000

-> $s0를 0으로 세팅해놓고, lui로 앞 8비트를 세팅한 다음, ori로 2304와 or 연산

 

Addressing in Branches and Jumps

Branch(I-format)

  • Branch Addressing(Beq, Bne) -> PC-relative Addressing
  • Program Counter: 현재 명령어의 주소를 저장
  • Target Address = (PC + 4) + Offset * 4 -> PC를 호출하자마자 다음 word로 넘어감 (+ 4), byte addressing (* 4)

 

Jump(J-format)

  • pseudodirect addressing: jump에서 사용하는 주소 접근법
  • j 타입의 address부분은 26비트밖에 없는데, 이 26비트 안에 32비트의 주소를 축소시켜 넣는 방법
  • 뒤의 00비트를 비우는 이유 -> byte addressing (*4)
  • 앞의 4비트는 PC에서 가져옴 -> jump의 목적지와 PC address가 인접한 곳에 위치했다 가정

 

Program Counter(PC)

  • 현재 실행되는 명령어의 주소를 담은 레지스터

 

MIPS Addressing Mode Summary

Immediate addressing

  • operand에 명령어의 상수가 포함(addi)

 

Register addressing 

  • 주소 필드가 메모리가 아닌, 레지스터를 가리키는 경우(R-format)

 

Base addressing

  • operand가 메모리에 위치하고, 명령어의 const와 register의 합으로 주소 알아냄 -> 어레이의 시작점 + offset(lw, sw)

 

PC-relative addressing

  • branch address의 주소가 명령어의 const와 PC의 합(bne, beq)

 

Pseudodirect addressing

  • Jump address가 PC의 upper bits와 명령어의 26bits가 합쳐진 형태