컴퓨터가 사람의 언어를 이해하는 과정
사람 -> High level language(C, C++, Java..) -> Assembly language(Instruction) -> machine language(Binary) -> CPU
ISA(Instruction Set Architecture) - Instruction의 집합
1) Instruction
- 하드웨어와 소프트웨어의 인터페이스
- 프로세서의 동작을 묘사하는 기본 명령
2) CISC (Complex Instruction Set Computer)
- 비교적 오래됨
- 복잡하고 많은 명령어로 이루어짐
- 어셈블리 프로그래밍이 쉬운 반면에 CPU 설계가 어려움
3) RISC (Reduced Instruction Set Computer)
- 비교적 최신
- 작고 기본적인 명령어로 이루어짐
- 어셈블리 프로그래밍 시 코드가 길어지지만 CPU 설계가 간단함
Instruction(In MIPS)
1) Arithmetic Instruction
- 기본적인 산술연산을 수행하는 명령어(add, sub, mul, div, ...)
2) Data transfer Instruction
- 레지스터는 메모리보다 훨씬 작기 때문에 필요한 데이터만 메모리에서 가져오거나 메모리에 저장해야함
- lw(load word : from memory to register), sw(store word : from register to memory)
- 메모리에 word는 4byte 단위로 저장되므로 offset은 접근한 데이터의 x번째 인덱스 * 4가 됨
- base address + offset으로 접근할 데이터의 address를 계산해서 메모리에서 레지스터로 데이터를 가져오게 됨
Representing Numbers in Binary
1) Unsigned Binary
- 부호없는 2진수
- n 비트가 주어졌을 때, 0 ~ 2^n -1 까지 표현 가능
2) Signed Binary
- 1's complement(1의 보수)
: 부호가 있는 2진수로, n 비트가 주어졌을 때, -{2^(n-1) - 1} ~ {2^(n-1) - 1}까지 표현 가능(-0이 존재하기 때문)
- 2's complement(2의 보수) -> 1's complement보다 산술 연산이 쉬움
: 부호가 있는 2진수로, n 비트가 주어졌을 때, -2^(n-1) ~ {2^(n-1) - 1}까지 표현 가능
3) Signed extension
- signed binary를 load 시 부호가 바뀌지 않고 load할 수 있도록 해줌
Representing Instructions in Binary(In MIPS)
1) R-format : Arithmetic, Logic Instruction을 표현하기 위한 형식
(1) op : instruction의 기본 동작 (add, sub, mul, div, ...)
(2) rs : source register 1 (피연산자)
(3) rt : source register 2 (피연산자)
(4) rd : destination register
(5) shamt(shift amount) : shift연산 시 이동하는 비트 수
(6) funct : 같은 opcode 내에서 특정한 연산을 구별하기 위한 비트 (ex : R-format/add, R-format/sub)
ex) add $t0, $s1, $s2 -> 00000010 00011001 00100000 00010000
2) I-format : Data transfer, Arithmetic with Immediate, conditional branch instruction을 표현하기 위한 형식
(1) op : instruction의 기본 동작 (lw, sw, addi, subi, branch...)
(2) rs : source register 1 (피연산자)
(3) rt : destination register
(4) constant or address : 상수 값으로 산술 연산 시, 상수 값이 저장되거나, 다른 연산 시에 필요한 주소값 저장
ex) lw $t0, 1200($t1) -> 10001101 00101000 00000100 10110000
3) J-format : Unconditional Jump instruction을 표현하기 위한 형식
(1) op : instruction의 기본 동작 (j...)
(2) address : target address (다음 실행할 명령어의 주소)
Instruction and Addressing(In MIPS)
1) branch instruction
- 분기문은 for, if문처럼 사용되는 명령어로 다음 실행할 명령어는 대게 분기문 근처에 존재. 따라서 PC-relative addressing 방식을 사용
(1) PC(Program Counter) : CPU 내부에 있는 레지스터 중 하나로, 다음에 실행할 명령어의 주소를 저장하고 실행할 기계어의 위치 지정
(2) PC-relative addressing: PC 값을 기준으로 offset 값을 더해 계산. branch instruction의 I-format은 주소를 16비트 밖에 표현할 수 없고, branch에서 근처에 있는 명령어로 분기하기 때문에 PC-relative addressing방식 사용
2) jump instruction
- jump instruction의 target은 code segment의 어디든 존재할 수 있음. 따라서 Pseudodirect addressing 방식 사용
(1) Pseudodirect addressing: PC의 상위 4비트와 address의 조합으로 주소를 지정. Jump instruction은 branch instruction과 다르게 주소를 26 비트까지 표현 가능. 32 비트 전부를 표현할 수 없기 때문에 PC의 상위 4비트를 가져옴. 즉, 아무리 프로그램 어디에나 jump할 수 있다고 해도 boundary가 있기 때문에 이를 고려해야함
Target address = PC[31:28] : (address x 4)
Procedure calls
1) 프로시저란?
- 서브루틴, 함수 등과 같은 의미로 특정 작업을 수행하기 위한 instruction의 집합
2) 프로시저 실행 과정
(1) 인자를 프로시저가 접근할 수 있는 장소에 저장
(2) 제어의 흐름을 프로시저로 변경
(3) 특정 작업 수행
(4) 수행 결과를 프로시저를 호출한 함수가 접근할 수 있는 장소에 저장
(5) 제어의 흐름을 프로시저를 호출한 곳으로 반환
3) Supporting Procedure in MIPS - Registers
(1) $a0 ~ $a3 : parameter에 전달하기 위한 4개의 argument register
(2) $v0, $v1 : 반환 값을 저장하기 위한 2개의 register
(3) $ra : 프로시저를 호출한 코드의 위치를 기억하기 위한 레지스터(return address)
4) Supporting Procedure in MIPS - Instruction
(1) Procedure call instruction : jal ProcedureAddress (jump and link)
- jump : 제어의 흐름을 프로시저로 이동
- link : 제어의 흐름을 원래 위치로 복귀하기 위해 $ra 레지스터에 return address 저장
(2) Procedure return instruction : jr $ra
- PC(program counter)에 $ra에 저장된 return address를 복사해 프로시저를 호출한 원래 위치로 복귀
5) Register spilling
- procedure에는 4개의 argument register와 2개의 return value를 저장하는 register, 1개의 return address를 저장하는 register가 있음. procedure가 중첩해서 호출되거나 더많은 매개변수, 리턴 값을 필요로할 경우에는 앞에서 말한 register보다 더 많은 register를 필요로 하게 되므로 제한된 수의 register를 사용하기 위해 caller procedure의 지역 변수를 메모리(stack)에 저장하게 됨
6) Stack
- stack은 register spilling 시에 register의 저장된 값을 메모리에 저장하기 위한 자료구조.
- 후입선출(LIFO).
- stack pointer($sp)가 가장 최근에 할당된 주소를 표시.
- stack은 high addressd에서 low address로 이동.
- frame pointer($fp)는 프로시저가 호출될 때의 stack pointer위치를 기억해 프로시저의 수행이 완료될 시에 stack pointer가 원래 위치로 돌아갈 수 있도록 함.
Executing a Program
'CS > Computer Architecture' 카테고리의 다른 글
[컴퓨터구조] 어셈블리어와 고급언어 (0) | 2020.07.12 |
---|---|
[컴퓨터구조] 폰노이만 구조와 하버드 구조 (0) | 2020.07.12 |
Computer Abstraction and Technology (1) | 2019.12.22 |
Processor - Datapath (0) | 2019.12.17 |
Memory Hierarchy (0) | 2019.12.16 |
댓글