학교에서 들은 컴퓨터 구조 강의 내용을 복습하면서 작성한 글입니다.
March 20, 2024 3:53 PM
Stored Program Computer (폰노이만 컴퓨터)
- 프로그램(binary code로 구현), 데이터가 메모리 안에 저장되어 있는 구조
- Binary Compatibility → 컴파일된 프로그램이 다른 컴퓨터들에서 작동할 수 있도록
- ISA(Instructions Set Architecture)
MIPS instruction set
- 입력 operand는 2개까지만 가능
- Arithmetic Operations
Registers
- small amount of fast storage
- MIPS: 32x 32bit registers
Using Memory Values
- memory의 값을 register에 load
- register의 값 Processor의 ALU에서 계산 후 결과 다시 register로
- register에 있는 결과값을 memory로 store
Register Operands
- t0 ~t9: temporart values
- s0~s7 : saved values
Memory Operands(메모리 주소 체계)
- 메모리는 byte-addressed (1byte=8bit)
- words(4bytes = 1word) are aligned → 주소는 4의 배수
- MIPS : Big Endian
Endiannes
- data가 메모리에 저장되는 방식
UTF-16
- 16bit(2byte) Unicode transformation : 한글, 타문자..
- 1 character = 2bytes or 4 bytes
- 예: 가 = 0xAC00 → big Endian: AC 00/ Little Endian: 00 AC
Byte Order Mark
- UTF-16 파일의 앞부분에 있는 dummy character = 0xFEFF
- 순서 나타내는 mark(Endian 다른 machine이 이상하게 읽는 것 방지
- FEFF 로 읽힌다면 Big Endian 사용, FFFE로 읽힌다면 Little Endian 사용해서 만들어졌음을 알수 있음
Example
- C code: g = h + A[8];
- (g는 $s1, h는 $s2, A의 시작주소는 $s3)
A[0] 의 시작주소: 0x1000
A[8]의 주소(pointer): &A[0] + 8*sizeof(int) = &A[0] + 32 = 0x1032
→ compiled MIPS code
lw $t0, 32($s3) //load word
add $s1, $s2, $t0
lw Rd, A(Rm)
- Rd: 메모리에서 값이 load되는 레지스터
- A: 메모리 offset (byte) - 기존주소에서 얼만큼 떨어졌는지!
- Rm: 메모리 주소가 저장된 레지스터(base address의 주소)
- C code: A[12] = h + A[8];
lw $t0, 32($s3) //load word add $t0, $s2, $t0 sw $t0, 48($s3) //store word
- (h는 $s2, A의 시작 주소는 $s3)
- C code(sum: $s1, i: $s2, A: $s3)
addi $t0, $t0, 4 lw $t1, 0($t0) add $s1, $s1, $t1
- → compiled MIPS code
- for (i = 0 ; i < 10; i++) sum += A[i];
Instructions
Immediate Operands(상수 Operand)
- 명령어에 상수 포함 addi $s3, $s3, 4
- subtract(뺄셈은 따로 없음 → 뺄셈도 덧셈임: 음수 더하기) X addi $s2, $s1, -1
The Constant Zero
- MIPS register 0 ($zero) 는 상수 0 임 → overwritten 안됨
- userful
- move between registers: add $t2, $s1, $zero ($t2 ← $s1)
- loading immediate value: addi $t2, $zero, 10
Load Immediate Value
- li 명령어
- li $d, immediate_value
- li $t0, 100
- li $t0, 0x10
- add $t3, $t1, $ t2
- real instruction이 아닌 합성명령어임(coding의 편리를 위해)
Multiply
- 값 2개 받고, 결과 쪼개서
- 32bit X 32bit → 64bit(32bit 두개의 결과값)
- 예) $11_2 \times 11_2 = 110_2 + 11_2 = 1001_2$
- mult $r, $s → 곱하고 결과를 HI, LO (결과값 담는 register) 에 PUTHI LO
- mfhi $d
- HI에 있는 곱셈 결과를 $d로 이동
- mflo $d
- LO에 있는 곱셈 결과를 $d로 이동
- mul $d, $r, $s
- $r 과 $s를 곱하고 [31:0]의 결과를 $d 로 put → 값 크지 않으면 결과를 바로 register에
Divide
- div $r, $s
- $r을 $s로 나누고, 결과를 LO에, 나머지는 HI에
- binary인 경우에 곱셈길를 나눗셈기로 사용가능
Data Transfer
- lw, lh, lb: load (word, halfword, byte)
- sw, sh, sb: store
- lui :load upper immediate (upper bit에 값 복사)
- lui, $t0, 0x2 → $t0: 0x20000
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] Logical Operations (1) | 2024.06.15 |
---|---|
[컴퓨터 구조] MIPS instructions (0) | 2024.06.15 |
[컴퓨터 구조] SPEC Benchmark & Amdahl’s law (0) | 2024.06.15 |
[컴퓨터 구조] IC 제조 & Performance (0) | 2024.04.27 |
[컴퓨터 구조] 컴퓨터 추상화와 구조 (0) | 2024.04.27 |