KOCW 최규상 교수님 컴퓨터구조 강의 정리
이 글은 공부한 것을 복습 및 기록하기 위한 게시물입니다.
잘못된 정보가 기입되어 있을 수 있으니 주의해주시기 바랍니다.
참고 : 컴퓨터 구조 및 설계 - David A. Patterson,John L. Hennessy
강의 링크 : http://www.kocw.net/home/cview.do?lid=4e4c594ab2a7a659
1. Unsigned Binary Integers
컴퓨터에서는 2진수를 사용한다.
n비트로 되어있는 숫자는 위와 같이 표현한다.
범위는 0 to +2ⁿ – 1 이다.
공식의 예로는 위와 같다.
0부터 4,294,967,295까지 표현이 가능하다.
2. 2s-Complement Signed Integers
n비트로 되어있는 숫자는 위와 같이 표현한다.
범위는 위와 같다.
항상 음수의 최대값이 양수의 최대값보다 하나 더 많다.
공식의 예로는 위와 같다.
–2,147,483,648부터 +2,147,483,647까지 표현이 가능하다.
2s-Complement Signed Integers를 읽을 때 항상 가장 왼쪽에 있는 LSB(31bit)는 Sign bit이다.
0이면 양수이고 1이면 음수이다.
음수의 최대 값은 LSB만 1이고 나머지는 모두 0이다.
양수의 최대 값은 LSB만 0이고 나머지는 모두 1이다.
3. Signed Negation
부호를 바꿔주는 것이다.
각 비트의 값을 반전 시켜주고 해당 값에 1을 더해주는 것이다.
4. Sign Extension
예를 들어 8bit를 16bit 혹은 32bit로 확장하는 것이다.
bit의 수를 확장할때도 음수는 그대로 유지되어야 한다.
sign bit를 왼쪽에서 부터 확장하면 되며 모든 값을 1로 채운다.
unsigned는 0으로 채우면 된다.
5. Representing Instructions
모든 명령어는 binary로 표현되며 이것을 기계어라고 한다.
MIPS 명령어는 32bit로 표현이 된다.
32bit 코드지만 MIPS명령어는 operation code의 수가 적다.
MIPS는 Format이 별로 없어 간단히 만들 수 있고 높은 성능을 얻을 수 있다.
6. MIPS R-format Instructions
Arithmetic Instruction이다.
32bit은 6개의 영역으로 구성되어있다.
- op : Operation 코드이다.
- rs : source register이다.
- rt : target register이다.
- rd : destination register이다.
- shamt : shift amount이다.
- funct : function code를 나타낸다.
6-1. R-format Example
add의 opcode는 0이다.
s1과 s2는 각각 source register와 target register로 가며 t0또한 destination register로 간다.
shift 연산이 아니기에 shift amount는 0이다.
해당 값들을 bin으로 바꾸면 00000010001100100100000000100000이 되며 16진수로는 0x02324020이다.
CPU는 해당 값의 명령어(0x02324020)를 만나면 add $t0, $s1, $s2을 실행한다.
7. Hexadecimal
컴퓨터에서 어떤 숫자를 표현할 때 사람들이 이해하기 쉽게하기 위해 16진수로 표현한다.
16진수는 4bit를 표현할 수 있다.
8. MIPS I-format Instructions
immeditate format Instructions이다.
4개의 영역으로 구성되어 있다.
- Operation code
- source register
- target register
- constant 또는 address
해당 format에 들어가는 명령어의 종류는 Immediate arithmetic 와 load/store instructions 이다.
target register는 destination register 일 수도 있고 source register가 될수도 있다.
constant는 해당 범위까지 표현할 수 있다.
address는 source register에서 더해지는 offset이다.
Design Principle 4: Good design demands good compromises
상이한 서로 다른 두개를 하나로 만드는 것이다.
Immediate arithmetic 와 load/store instructions은 각각 다른 instruction이지만
I-format Instructions으로 두개를 모두 사용할 수 있다.
이렇게 되면 Instruction의 복잡도가 낮아진다.
format이 단순해져서 훨씬 더 고성능을 얻을 수 있다.
9. Stored Program Computers
메모리에는 다양한 프로그램이 들어가며 명령어는 binary로 되어있다.
인스터럭션과 데이터는 메모리에 있다.
프로그램은 프로그램에 관련된 프로그램을 제공한다.
어떤 바이너리 코드가 다른 머신에서 실행될 수 있는지는 표준화된 ISA가 지원이 되면 가능하다.
10. Logical Operations
이런 bit연산은 한 word에서 특정한 bit의 값을 뽑아내거나 추가할 때 효과적으로 사용할 수 있다.
11. Shift Operations
R-format Instructions이다.
shamt는 shift를 몇번 할 것인지를 나타낸다.
Shift left logical은 bit를 왼쪽으로 shift하고 0으로 채우는 것이다,
i만큼 bit를 shift left를 하게 되면 2에 i로 제곱한 효과가 있다.
Shift right logical bit를 오른쪽으로 shift하고 0을 채우는 것이다.
i만큼 bit를 shift right를 하게 되면 2에 i로 나머지 연산을 한 효과가 있다.
12. AND Operations
특정한 bit의 값을 뽑아낼때 사용한다.
13. OR Operations
특정한 bit를 1로 설정할때 사용하기 좋다.
14. NOT Operations
bit를 모두 반전시키는 것이다.
MIPS는 NOT Operations를 가지고 있지 않다.
대신 nor Operations을 사용하여 NOT Operations을 구현한다.(nor $t0, $t1, $zero)
15. Conditional Operations
C언어로 보면 조건문과 같다.
beq rs, rt, L1은 rs와 rt의 값이 같으면 L1으로 가는 것이고 같지 않으면 다음 명령어를 실행한다.
bne rs, rt, L1은 rs와 rt의 값이 같지 않으면 L1으로 가는 것이다. 같으면 다음 명령어를 실행한다.
j L1은 무조건 L1으로 가는 것이다.
15-1. Compiling If Statements
f, g, h, i, j가 $s0, $s1, $s2, $s3일때 컴파일 된 MIPS 코드를 봐보자
bne $s3, $s4, Else i와 j가 같으면 다음 명령어(add $s0, $s1, $s2)를 실행하고
그렇지 않다면 Else(sub $s0, $s1, $s2)를 실행한다.
만약 값이 같다고 했을 때 g와 h를 더한 후 f에 값을 집어 놓고 Exit을 실행하게 된다.
만약 값이 같지 않을 경우 g와 h를 뺀 후 다음 명령어인 Exit을 실행하게 된다.
15-2. Compiling Loop Statements
while문에 대한 C코드를 MIPS로 컴파일 한 경우이다.
i를 2만큼 bit를 왼쪽으로 shift를 시킨 후 t1에 넣는다.(i가 1이라면 4가 된것), 즉 4를 곱한 것이다.
save가 integer 배열이라 1개의 element가 4byte이다.
그래서 index만큼 index에 4를 곱해준 다음 더해줘야 한다.
t1과 save 배열의 시작주소를 더해서 다시 t1에 넣는다.
그 다음 t1을 4byte(word)만큼 load해서 t0에 넣는다.
그리고 t0와 $s5(k)가 같지 않으면 Exit으로 가고 같다면 다음 명령어를 실행한다.
$s3(i)에 1을 더한 후 $s3(i)에 넣는다.
그리고 Loop로 다시 점프한다.
16. Basic Blocks
명령어들의 시퀀스이다.
Basic Blocks은 2가지 조건을 만족해야 한다.
- 중간에 branch 명령어가 없어야 한다.
- 중간에 branch target이 없어야 한다.(처음에는 있어도 된다.) - ex.(라벨되어 있는것 loop exit 등등)
compiler는 Basic Blocks을 찾아서 Basic Blocks을 빨리 실행하도록 하는 일을 한다.
프로세서 역시 Basic Blocks을 빨리 실행하게 한다.
compiler와 프로세서는 Basic Blocks을 높은 성능을 얻기 위해 최대한 빨리 실행해야한다.
17. More Conditional Operations
어떤 조건이 true이면 결과에 1을 세팅하고 그렇지 않으면 0을 세팅한다.
slt rd, rs, rt
rs가 rt보다 작으면 rd에 1을 저장하는 것이고 그렇지 않다면 0을 저장하는 것이다.
slti rt, rs, constant
rs가 상수보다 작으면 rt는 1 아니면 0을 저장하는 것이다.
slt는 beq, bne와 같이 사용된다.
18. Branch Instruction Design
blt, bge, etc 이런것은 왜 지원해주지 않는가
H/W에서 어떤 값이 같은지 틀린지보다는 작거나 크거나 연산이 훨씬 복잡하다.
=, ≠을 연산하는 것보다 <, ≥을 연산하는 것이 더 오래 걸린다.
즉, 더 많은 시간이 필요하므로 더 느린 clock period를 사용해야 한다.
느린 clock period를 사용하면 모든 연산은 다 느려지게 된다.
그래서 beq, bne이 흔하게 사용되어 이것만 지원해주게 된다.
19. Signed vs. Unsigned
Unsigned 는 명령어 끝에 u를 붙여야줘야 한다.(sltu, sltui)
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
8. Instructions: Language of the Computer 4 (0) | 2021.04.14 |
---|---|
7. Instructions: Language of the Computer 3 (0) | 2021.04.11 |
5. Instructions: Language of the Computer 1 (0) | 2021.04.08 |
4. Computer Avstractions and Technology 4 (0) | 2021.04.03 |
3. Computer Avstractions and Technology 3 (0) | 2021.03.31 |