| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
                            Tags
                            
                        
                          
                          - regression
 - 해커톤
 - 오블완
 - LG Aimers
 - 회귀
 - ChatGPT
 - AI
 - OpenAI
 - LG Aimers 4th
 - deep learning
 - 딥러닝
 - LG
 - GPT-4
 - Machine Learning
 - 머신러닝
 - 티스토리챌린지
 - 지도학습
 - Classification
 - gpt
 - 분류
 - LLM
 - PCA
 - supervised learning
 
                            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가 합쳐진 형태
 

728x90
    
    
  반응형
    
    
    
  '3학년 1학기 전공 > 컴퓨터 구조' 카테고리의 다른 글
| [컴퓨터 구조] Lecture 09: Arithmetic for Computers (0) | 2024.04.13 | 
|---|---|
| [컴퓨터 구조] Lecture 08: Instructions - Language of the Computer (0) | 2024.04.13 | 
| [컴퓨터 구조] Lecture 07: Instructions - Language of the Computer (0) | 2024.04.05 | 
| [컴퓨터 구조] 3주차 정리 (1) | 2024.03.22 | 
| [컴퓨터 구조] 1, 2주차 정리 (1) | 2024.03.19 |