728x90
- 본 문서는 kocw 의 [컴퓨터구조] - 영남대학교 최규상 교수님의 강의를 보고 작성하였습니다.
Unsigned Binary Integers(부호가 없는 이진수)
- 모든 내용을 0과 1로 표현하는 것
- n-bit로 되어있는 수의 표현 방식
- 범위 : 0 ~ 2^n - 1
- ex)
-
0000 0000 0000 0000 0000 0000 0000 1011(2) = 0 + ... + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 0 + ... + 8 + 0 + 2 + 1 = 11(10)
- 32bits
- 범위 : 0 ~ 4,294,967,295
-
2의 보수로 표현하는 부호가 있는 정수
- n-bit로 되어있는 수의 표현 방식
- 범위 : -2^n-1 ~ +2^n-1 -1
- 음수의 최대값이 양수의 최대값보다 하나 더 많은 범위로 표현
- ex)
-
1111 1111 1111 1111 1111 1111 1111 1100(2) = -1 * 2^31 + 1 * 2^30 + ... + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 = -2,147,483,648 + 2,147,483,644 = -4(10)
- 32bits
- 범위 : -2,147,483,648 ~ +2,147,483,647
-
- 31bit -> 가장 왼쪽에 있는 bit(LSD)는 부호를 나타내는 비트
- 1 : 음수
- 0 : 양수 or 0
- -(-2^n-1)과 같은 숫자는 표현되지 않는다
- 양수의 경우 2의 보수로 표현한 수와 부호 없이 표현한 수가 같다
- 표현
-
0 : 0000 0000 ... 0000 -1 : 1111 1111 ... 1111 음수 최댓값 : 1000 0000 ... 0000 양수 최댓값 : 0111 1111 ... 1111
-
Signed Negation(부호 바꿈)
- 양수를 음수로, 음수를 양수로 바꾸어주는 것
- Complement and add 1
- complement : 0 -> 1로, 1 -> 0 으로 바꿈
- ex) negate +2 (양수2 부호 바꿈)
-
+2 = 0000 0000 ... 0010(2) -2 = 1111 1111 ... 1101(2) + 1 = 1111 1111 ... 1110(2)
-
Sign Extension
- 숫자를 더 큰 비트로 표현하는 것
- 8bit -> 16bit, 32bit ..
- 더 큰 비트로 표현되어도 부호는 유지되어야 한다
- MIPS instruction set
- addi : extend immediate value
- lb(load byte), lh(load halfword, load two byte) : extend loaded byte/halfword
- beq, bne : extend the displacement
- sign bit 를 왼쪽에서부터 확장한다
- unsigned 값은 0으로 채운다
- sign bit 의 값을 확장된 곳에 채운다
- ex) 8bit -> 16bit
-
+2 : 0000 0010 => 0000 0000 0000 0010 -2 : 1111 1110 => 1111 1111 1111 1110
-
Representing Instructions
- 모든 명령어는 2진수(binary)로 표현된다
- machine code 라고 부른다
- MIPS instruction(명령어)
- 32bit words 로 표현된다
- 적은 operation code (opcode), register numbers, ..
- 간단하게 만들 수 있고 성능이 빠르다.
- Register numbers
- $t0 - $t7 : reg's 8 - 15
- $t8 - $t9 : reg's 24 - 25
- $s0 - $s7 : reg's 16-23
MIPS R-format instrructions
- Instruction fields(명령어 필드)
- op : operation code (opcode)
- rs : first source register number
- rt : second source register number
- rd : destination register number
- shamt : shift amount (00000 for now)
- funct : function code (extends opcode)
- ex)
- add $t0, $s1, $s2
-
0000001000110010010000000100000(2) = 02324020(16)
Hexadecimal(16진법)
- bit 문자열을 간결하게 표현하기 위한 방법
- 4bits/hex digit
0 | 0000 | 4 | 0100 | 8 | 1000 | c | 1100 |
1 | 0001 | 5 | 0101 | 9 | 1001 | d | 1101 |
2 | 0010 | 6 | 0110 | a | 1010 | e | 1110 |
3 | 0011 | 7 | 0111 | b | 1011 | f | 1111 |
- ex) eca8 6420(16) = 0Xeca8 6420 = 0xeca8 6420
- 1110 1100 1010 1000 0110 0100 0010 0000(2)
MIPS I-format Instructions
- I-format : immediate format
- immediate arithmetic(즉시 연산) and load/store instructions
- rt : destination or source register number (대상 또는 소스 레지스터 수)
- constant(상수) : -2^15 ~ +2^15 - 1
- address : offset added to base address in rs (rs 단위의 기본 주소에 오프셋 추가)
- 디자인 원칙 4 : 서로 다른 두 가지를 하나로 잘 합친다
- 서로 별개인 immediate arthmetic과 load/store instructions를 MIPS I-format instruction으로 잘 합친다
- instruction format 이 단순해진다
- 단순해지면서 고성능을 얻을 수 있게 된다
Stored Program Computers
- 메모리에는 다양한 프로그램들이 존재한다
- 명령어들은 일반 데이터처럼 binary(2진법)으로 되어있다
- 명령어와 데이터는 메모리에 있다
- 프로그램과 관련된 프로그램이 존재한다
- 컴파일러, 링커 ..
- 어떤 바이너리 코드가 다른 머신에서 실행될 수 있는가?
- 표준화된 ISA 가 있으면 가능하다
Logical Operations(논리 연산)
Operation | C | Java | MIPS |
Shift left | << | << | sll |
Shift right | >> | >> | srl |
Bitwise AND | & | & | and, andi |
Bitwise OR | | | | | or, ori |
Bitwise NOT | ~ | ~ | nor |
- Bitwise : 비트 단위로 AND, OR, NOT 을 확인한다
- 한 워드(word)에서 특정한 비트에 대한 연산에서 효과적으로 사용할 수 있다
Shift Operation
- shamt : shift 연산을 몇 번 할 것인가?
- Shift left logical
- 왼쪽으로 shift 후 0으로 채운다
- i bit 만큼 shift left 연산을 하면 2^i 만큼 곱한 효과가 있다
- Shift right logical
- 오른쪽으로 shift 후 0으로 채운다
- i bit 만큼 shift right 연산을 하면 2^i 만큼 나눈 효과가 있다(unsigned 에서만 가능하다)
AND Operation
- 모두 1일 때만 1이 되기 때문에 특정한 비트의 값을 뽑아낼 때 사용한다
- $t1 과 $t2 모두 1일 때만 $t0가 1
- MIPS
- and $t0, $t1, $t2
OR Operation
- 둘 중 하나만 1이어도 1이 되기 때문에 특정한 값을 1로 세팅할 때 사용한다
- $t1 과 $t2 중 하나만 1이면 $t0가 1
- MIPS
- or $t0, $t1, $t2
NOT Operation
- 0 -> 1, 1 -> 0 으로 반대로 만들어주는 연산
- MIPS
- nor $t0, $t1, $zero
- $t1의 값을 모두 반대로 바꿔준다.
Conditional Operation
- if else 와 같은 형태
- 조건이 true 이면 labeled 되어있는 instruction 으로 branch
- beq rs, rt, L1
- rs 와 rt 의 값이 같으면 L1 으로
- bne rs, rt, L1
- rs 와 rt 의 값이 같지 않으면 L1 으로
- j L1
- 무조건 L1 으로
Compiling If Statements
C code
if (i == j) f = g + h;
else f = g - h;
- f, g, ... in $s0, $s1, ...
Compiled MIPS code
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: ... (Assembler calculates addresses)
Compiling Loop Statements
C code
while (save[i] == k) i += 1;
- i in $s3, k in $s5, address of save in $s6
Compiled MIPS code
Loop: sll $t1, $s3, 2 = $s3 * 4
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit: ...
Basic Blocks
- 다음 두 조건을 만족하는 어떤 명령어들의 sequence(집합)
- 중간에 branch 명령어가 없어야 한다 (마지막엔 가능)
- 중간에 branch target(label이 된 것) 이 없어야 한다 (처음엔 가능)
- ex) Loop, Exit
- 컴파일러와 프로세서는 basic block을 빠르게 실행하게 하기 위한 일을 한다
- 고성능을 얻기 위함
More Conditional Operations
- 어떤 조건이 true 이면 결과에 1을 세팅, 아니면 0
- ex)
- slt rc, rs, rt
- if(rs < rt) rd = 1; else rd = 0;
- slti rt, rs, constant
- if(rs <constant) rt = 1; else rt = 0;
- slt $t0, $s1, $s2 bne $t0, $zero, L
- if ($s1 < $s2) branch to L
- slt rc, rs, rt
Branch Instruction Design
- 하드웨어에서 =, ≠ 연산보다 <, ≥ 연산이 더 느리다
728x90
'Alchitecture' 카테고리의 다른 글
프로시저의 6가지 실행 단계 (0) | 2022.01.05 |
---|---|
컴퓨터 하드웨어의 연산과 피연산자부 (0) | 2022.01.03 |
전력 장벽과 멀티코어, 성능 벤치마크 (0) | 2021.12.31 |
컴퓨터의 성능 (0) | 2021.12.30 |
프로세서와 메모리 그리고 성능 (0) | 2021.12.29 |