(비전공자 CS 공부) 컴퓨터과학과 실습 4편 - The-LC-3
The LC-3
The ISA: Overview
ISA는 Instruction Set Architecture의 약어로 프로그래머가 컴퓨터의 기계어로 프로그램을 작성할 때 프로그래머가 이용할 수 있는 컴퓨터와 관련한 모든 것을 망라한 것이다.
이게 programmer-visible state와 operations of computer로 이루어지는데
- programmer-visible state: memory organization과 register set로 이루어져 있고
- operations of computer: Instruction set로 이루어져 있다.
LC-3의 메모리는 2^16의 address space와 16bit의 addressability를 가지고 있다. LC-3에서 처리되는 데이터는 보통 16bit이고 이를 word라고 표현한다.
Memory Organization
LC-3의 메모리는 2^16의 address space와 16bit의 addressability를 가지고 있다. LC-3에서 처리되는 데이터는 보통 16bit이고 이를 word라고 표현한다.
Registers
Processing unit에서 연산을 처리하기 위해 메모리랑 교신하는 게 아니라 연산을 더 빠르게 하기 위해 일시적인 저장소(Temporary Storage)를 사용하는데 이를 Register라고 부른다.
LC-3에서는 일반적인 목적의 8가지 Register가 존재(R0 ~ R7)하고 각각은 16bit의 길이를 갖는다.
- 각 레지스터 8개를 알아볼 수 있어야 하는데 3bit(0 ~ 7)를 사용해 Register를 식별한다.
- LC-3의 레지스터 Set의 snapshot 이미지인데 이를 register file이라고 칭한다.
The Instruction Set
Instruction은 이전 편에서 배운 것처럼 Opcode(컴퓨터에게 무엇을 시킬 건지)와 Operand(피연산자)로 이루어진다. 이 때 Instruction set은 opcode와 data types, address mode의 set으로 정의된다.
address mode란? 메모리에서 operand의 location이 어디에 있는지 결정. data type: operand를 bit로 표현한 것
Opcodes
- LC-3에서는 15가지의 opcode를 갖는다.
- 그 종류는 3가지가 있다.
- Operate Instruction: 정보를 처리하고
- Data movement Instruction: 메모리와 레지스터 사이나 메모리/레지스터와 input/output 간의 데이터를 이동시킨다.
- Control Instruction: 원래는 PC에 저장된 다음에 실행할 Instruction의 주소를 순차적(+1)으로 실행하는데 해당 Instruction의 경우에는 이 sequence를 바꿀 수 있다.
Data Types
- 16bit의 2의 보수 정수로 표현한다.
Addressing Modes
- 어떻게 operand의 location이 지정될까?
- 메모리 주소에 없는 경우: immediate, register
- 메모리 주소에 있는 경우: PC-Relative, Indirect, base+offset
Immediate란? Operand의 위치는 3가지에서 찾을 수 있는데, memory, register, instruction의 일부이다. 여기서 Instruction의 일부 중 Operand의 bit를 즉시(Immediately)얻을 수 있을 수 있는데 이 의미에 착안해 immediate라고 칭한다.
Condition Codes
컴퓨터 프로그램에서 Instruction의 실행 순서의 변경에 사용되는 3가지 1bit register 모음으로 N(Negative), Z(Zero), P(Positive)가 있다. 각 레지스터마다 0또는 1으로 set 되는데, 예를 들어 GPR(General Purpose Register)이 operation Instruction의 결과값이 음, 0, 양이냐에 따라 N, Z, P Register 각각에 0또는 1이 set 된다.
Operate Instructions
Operate Instruction에는 오직 3가지 연산이 가능한데, add, and, not이다.
각 연산의 피연산자(operand)는 register에 있고 이 연산들은 메모리를 참조하지 않는다는 것이 특징이다.
그리고 앞서 배운 것처럼 ADD나 AND 연산 시에 Immediate mode를 사용할 수 있다. 즉, 레지스터를 참조하지 않고 Instruction의 일부에서 바로 operand를 가져와 사용하는 것이다.
각 Instruction이 어떻게 작동하는지 data 흐름 diagram으로 살펴보자.
ADD, AND, and NOT
Instruction을 살펴보면 맨 앞 4bit는 opcode로 Not 연산을 의미하는 bit고 GPR은 2가지가 사용된다. 왜 GPR이 2가지가 사용되냐면 위에서 볼 수 있듯이
- Not연산을 적용할 Operand(Source)가 필요하고 이 Src가 ALU에 들어가면
- ALU에서 NOT연산을 적용한 결과를 Dst인 다른 GPR에 Copy한다.
Note! Src와 Dst는 같은 register일 수 있다. 즉, R1 레지스터에 있는 값을 Not 연산을 적용 후에 다시 R1 레지스터에 Write 하는 것이다.
그리고 ADD, AND 연산은
- Src1이과 Src2에 저장된 값을 ALU에 전달하고
- ALU에서 ADD 또는 AND 연산을 한 결과값을 Dst 레지스터에 저장한다.
이때 this zero means “register mode”라는 말은 무엇일까? 앞 전에 immediate mode에 대해서 배웠는데 immediate mode와 연산에 필요한 피연산자를 어디서 찾을 것인지에 대해 0이면 레지스터에서 찾고 1이면 immediate mode로 해당 instruction의 1 오른쪽 5bit를 sign-extension을 통해 16비트로 변환해 값을 읽는다.
Immediates
- Instruction의 src1을 참조하고 내부 값을 참조해 16bit로 변환해 ALU에 넘겨준다.
- ALU에서 ADD OR AND 연산을 하여 결과 값을 Dst에 저장한다.
sign-extension 이란?
그럼 add, and, not만 있으면 빼기, or, copy, 0으로 초기화는 어떻게 이루어질까?
- subtract(빼기): src1과 빼야되는 값은 src2에 not 연산을 적용해 add 연산을 하면 된다.
- or: 드모르강 법칙을 통해 연산하면 된다.
- copy: register mode로 copy 하고 싶은 값과 0을 더해 원하는 register에 저장
- initialize a register to zero: 0으로 초기화하고 싶은 GPR과 Immediate mode로 0을 AND 시켜서 해당 GPR에 저장하면 된다.
Data Movement Instructions
크게 Load와 Store Instruction으로 구분된다.
- Load: 메모리에서 레지스터로 값을 read 읽어오는 것을 의미한다.
-
Store: 레지스터에서 메모리에 값을 write하는 것을 의미한다.
- Load effective address: immediate mode와 같이 메모리 주소를 계산만 하고 메모리에 접근하지 않는다.
PC-Relative Mode
Instruction에서 바로 데이터를 load할 주소를 지정하기를 원한다고 생각해보자.
메모리 주소도 16 bit인데 Instruction도 16bit다. 근데 opcode와 내가 저장할 Destination(레지스터 또는 메모리)를 합치면 7bit가 되므로 9bit로 주소를 표현할 수 있어야 한다.
이 때 솔루션으로 남은 9bit를 signed extend를 통해 16bit으로 만들고 PC에 저장되어 있는 현재 Instruction + 1의 값을 더한다.
Data flow로 보자면 다음과 같다.
- PC에 저장된 현재 Instruction Address + 1의 값과 현재 Instruction[8:0] 을 16비트로 변환해 더한다.
- 더한 값을 MAR에 주고
- 주소를 참조하도록 신호를 보낸다.
- 해당 주소에 찾은 값을 MDR에 Copy하고 해당 MDR에서 값을 읽기를 원하는 레지스터에 전달한다.
레지스터의 값을 메모리에 저장하려고 하는 경우에는,
- PC와 IR[8:0]을 더해서 저장할 메모리의 주소를 계산하고 레지스터의 값을 MDR에 Copy한다.
- 계산된 메모리 주소 값을 MAR에 넘겨주고
- MAR에게 해당 주소에 값을 Write하도록 신호를 보내면 MDR에 Copy된 레지스터의 값을 MAR에 저장된 주소에 저장한다.
Indirect Mode
이렇게 PC-relative mode를 사용하게 되면 저장할 수 있는 메모리의 범위가 9bit로 오직 256개의 instruction의 word의 값을 다룰 수 있게 된다. 그럼 나머지 메모리가 비기 때문에 이를 해결하기 위해서 사용하는 방법이다.
즉, PC-relative mode를 사용해 address를 생성하고 그 주소의 값을 MDR에 받아온 다음에 그 값을 주소로 사용해서 값을 Load하거나 Store하는 방법이다.
- PC와 IR[8:0]의 값을 통해 가져와 ALU에 전달해서 ADD 연산을 한다.
- 그렇게 연산된 값을 MAR에 넘겨주고
- MAR에서 생성된 Address를 참조한다.
- 그 주소에 있는 값을 가져와 MDR에 넘겨주고 그 값을 다시 새로운 주소로 사용하기 위해 MAR로 넘겨준다.
- 2에서 생성한 주소에 있는 값을 다시 MAR에서 주소로 사용해 Location의 content를 참조해 MDR에 전달하고
- MDR에서 전달받은 값을 READ해야 하는 레지스터에 넘겨준다.
- PC와 IR에서 주소를 ALU에 전달해서 더하고
- 새로운 주소를 생성한 값을 MAR에 넘겨준다.
- MAR에서 그 주소를 참조해 Content를 읽어와 MDR에 전달한다.
- 전달 받은 값을 다시 MAR에 넘겨 새로운 주소로 사용한다.
- 레지스터에서 메모리에 저장할 값을 MDR에 넘겨주고
- MAR에 새로 생긴 주소에 MDR의 값을 저장한다.
Base+offset Mode
PC-relative mode를 사용한 한계점을 극복하기 위한 두 번째 방법으로 임의의 레지스터의 값과 나머지 6bit를 sign extend를 통해 16bit를 만들고 이를 더해서 새로운 주소를 생성하는 방법이다.
즉, Instruction에서 Base와 Offset6을 볼 수 있는데 위에서 말한 것처럼
- base에 해당하는 레지스터의 값과 IR[5:0]의 Sext한 값을 더한다.
- 더해진 결과를 새로운 주소로 사용하기 위해 MAR에 전달한다.
- MAR에서 그 주소를 참조해 Content를 MDR에 전달하고
- 그 값을 필요한 레지스터에 복사한다.
Store는 한 번 생각해보면 비슷하다.
The LEA Instruction(Although Not Really an Operate)
이는 엄밀히 말하면 메모리와 교신하지 않기 때문에 data movement라고 할 순 없지만 PC-Relative와 같이 주소를 계산하고 그 값을 바로 레지스터에 저장하는 방식이다.
An Example
Control Instructions
Control Instruction은 컴퓨터 프로그램의 Instruction의 실행 순서를 변경하는 Instruction이다.
크게 세 종류가 있는데 간략한 내용은 다음과 같다.
- Conditional Branch:
- 특정 조건이 true인 경우: PC에 새로운 PC를 만들어 주소를 변경
- false인 경우: 원래 대로 다음 PC+1의 Instruction을 실행.
- Jump: 묻지마 pc 변경
- TRAP: PC 값을 Operating system의 service routine의 주소로 변경
Conditional Branches
다음 Instruction을 무엇으로 실행하지를 정하는 것으로 set bit(위에서 말했던 condition code)가 충족이 되면 branch에 설정된 Instruction으로 바로 넘어가게 되는 것이다.
이 때도 PC-Relative addressing mode를 사용해 현재 PC에서 다음 PC로 넘어갈 Instruction address를 결정하게 된다.
Note
- Instruction의 fetch 단계에서 pc는 이미 현재 pc값의 + 1이 된 상태다.
- Offset이 9bit이므로 256 words 이내에서 사용할 수 있다.
이 과정에 대한 예시를 보게 되면
- 현재 PC의 값(다음 실행할 Instruction 주소 + 1)과 IR[8:0]의 16bit 값을 더더해서 새로운 주소를 생성. 그리고 PC 값을 ALU에 전달할 때 PCMUX에도 전달한다. 왜냐하면 Condition이 충족되지 않았을 때 pc에는 원래 pc값이 들어가야하기 때문이다.
- 생성된 값을 PCMUX에 전달하고 IR[11:9] 즉, Condition code를 가져 PCMUX에 전달한다.
- Condition이 충족됐다면 새로 생성된 주소값(실행할 Instruction) PC에 전달하고 충족되지 않았다면 원래 PC값을 다시 할당해 순차적으로 실행한다.
Two Methods of Loop Control
예시를 보게 되면 정수 10개를 더하는 간단한 프로그램을 만드는 것인데, R1에는 정수가 들어있는 x3100 메모리 주소를 할당하고 R3에는 순차적으로 정수를 더할 때마다 갖게 되는 값을 가지고 있고 R2는 12번 더해야 하므로 12를 할당해서 R2가 0이 아니면 계속 -1을 해주도록 하는 것이다.
The Jump Instruction
간단하게 Base는 GPR 중 하나에 있는 값을 PC에 할당해 다음 실행할 Instruction의 address로 사용하는 것이다.
The TRAP Instruction
TRAP Instruction은 뒤 8bit인 trap vector로 식별하여 os의 service routine을 call한다.
그리고 routine이 끝나면 PC는 TRAP 바로 다음으로 오는 Instruction으로 set된다.
The Data Path Revisited
Basic Components of the Data Path
Global bus
- 위 이미지에서 검은색 큰 테두리를 Global bus라고 하는데, 16개의 wire를 가지고 있고 이를 통해 16bit의 정보를 다른 structure로 필요한 wire에 전기를 연결해 보낼 수 있다.
- 이 말은 bus에서 전달되는 정보를 wire를 통해 read는 16개 전부 한 번에 가능하지만 write는 그 중 딱 1개만 할 수 있다는 의미다.
- global bus에 연결되어 있는 wire에 삼각형(tri-state device)을 볼 수 있는데 이게 그 의미다. 이를 통해 정확히 딱 1개의 공급자가 정보를 bus에 싣을 수 있게 된다.
- 그리고 bus에서 운반되는 정보를 read하려면 LD.XX 처럼 Load enable 값을 1로 logic을 변경함으로써 가능하다.
Memory
- MAR, MDR로 구성되어 있고 Control Signal을 통해 read와 write가 가능하다.
- 메모리와 MAR, MDR 옆에 보면 화살표 머리가 채워지지 않은 화살표를 볼 수 있는데 이 화살표를 Control unit이라고 하고 이를 통해 write enable을 제어할 수 있다.
ALU
- input이 2개가 있는데 1개는 register에서 1개는 register 또는 immediate value일 수 있다.
- register file을 보게 되면 SR1, SR2가 있는데 이 값은 LC-3 operate instruction의 fields의 3-bit number이다.
- 그리고 두 번째 operand중 immediate value의 경우 LC-3 instruction의 5번째 bit에 의해 결정된다.
PC와 PCMUX를 살펴보게 되면 PC로는 PCMUX에 의해 3가지 인풋이 들어올 수 있는데
- Instruction Fetch stage에서 받는 PC+1
- BR이나 JMP에서 PC-Relative로 계산된 16비트 address 값이 있고
- 나머지는 추후에 다룬다.
MAR와 MARMUX는
- LD/ST, LDR/STR에서 생성된 새로운 주소와
- 추후에 다룬다.
Summary
이번 차시에서는 ISA에 대해서 배웠는데 SW와 HW를 연결해주는 Interface로 programmer-visible state와 operations of computer를 지정한다.
programmer-visible state에는 memory와 register가 있었고 연산에는 opcodes, data type, addressing modes가 있었다.
3가지 주요 instruction는 다음과 같다.
- operate: add, and, not, etc
- data movement: load, store
- control: branch, jump, trap, etc
댓글남기기