일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- regression
- deep learning
- ChatGPT
- LG Aimers 4th
- gpt
- GPT-4
- supervised learning
- 티스토리챌린지
- 머신러닝
- 분류
- 회귀
- 해커톤
- Machine Learning
- Classification
- LG
- 지도학습
- AI
- LLM
- LG Aimers
- PCA
- 오블완
- OpenAI
- 딥러닝
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가 합쳐진 형태
'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주차 정리 (0) | 2024.03.22 |
[컴퓨터 구조] 1, 2주차 정리 (0) | 2024.03.19 |