🔸System Software & Computer Architecture
🔹System Software, Machine Dependency
- 시스템 소프트웨어 설계는 실행되는 컴퓨터(머신)의 아키텍처에 크게 영향 받음
- ex) assembler는 mnemonic instruction을 해석하고, OS는 컴퓨팅 시스템의 리소스 관리
- 시스템 소프트웨어의 핵심 원리는 지속적으로 유지됨
- 시스템 소프트웨어의 기본 구조와 설계는 본질적으로 유사
- ex) assembler의 설계와 논리는 거의 모든 아키텍처에서 비슷
🔹Computer Organization and Design
- 5 classic components
- Input, Output, Memory, Datapath, Control
- Datapath와 Control은 종종 결합 → Processor
- Processor는 메모리로부터 isntruction과 데이터를 가져옴
- Input은 데이터를 메모리에 쓰고, Output은 메모리에서 데이터를 읽음
- Control은 Input, Output, Memory, Datapath의 작동을 결정
🔹Computer Architecture
- Memory unit은 program과 data 포함
- program: a sequence of instructions
- CPU는 ALU를 통해 instruction을 실행해서 program을 동작시킴 (메모리와 데이터를 교환하며 필요한 계산 처리)
- ALU(산술 논리 장치): 수학적, 논리적 연산 수행
- Contorl unit은 CPU 동작을 관리
🔹“Fetch-Decode-Excute” cycle ⭐
- 프로그램의 마지막 instruction(HALT, STOP, QUIT)에 도달할 때까지 반복
- 한 instruction마다 한 cycle
💡
Fetch(가져오기): 메모리에서 다음에 실행할 명령어 읽어오기
Decode(해독): 읽어온 명령어 해석 및 어떤 작업 수행할지 결정
Execute(실행): ALU, 메모리, I/O 컨트롤러에 적절한 명령을 보내 를 실제 작업 수행
- multi-core인 경우
- 각 core가 독립적으로 위의 cycle을 실행 → 명령어 동시 처리
- 병렬처리를 할 때, 여러개의 core가 동시에 일을 끝내게 하는게 아주 중요하므로 위의 cycle과정이 필요하다
- CISC vs RISC
🔸SIC & SIC/XE
- SIC(Simplified Instructional Computer)는 실제 기계에서 자주 사용되는 하드웨어 기능을 포함하는 가상의 컴퓨터
- 두 가지 버전:
- SIC: 표준 모델
- SIC/XE: 상위 호완 버전 (eXtra Equipment or Expensive)
- SIC/XE는 SIC보다 확장된 기능을 제공하므로, SIC에서 실행 가능한 프로그램은 SIC/XE에서도 실행할 수 있는 호환성을 보장하도록 설계해야 함

🔹SIC Architecture
일반적인 환경과 SIC 환경에서의 architecture를 비교 (in General vs in SIC)
[Memory]
In General
- 큰 단일 차원 배열 구성, 주소가 배열의 인덱스 역할을 하며 0부터 시작
- 고정 크기 단위인 cell
1byte로 나뉨, 각 cell마다 주소와 연결되어 식별
- 50byte 프로그램이면 n~n+49 영역 차지
- 명령어 한 줄이
4byte
- 주소 지정만 해주면 어떤 위치든지 매우 빠르게 접근 가능(bus를 통해)
- 실행중인 프로그램과 데이터가 주 메모리에 저장
- RAM은 CPU와 연결되어 데이터를 서로 빠르게 이동 가능
In SIC
- 명령어 한 줄이
3byte(24bit) word로 구성
- 최대 메모리 용량은 32KB →
2^15 bytes
[Register]
in General
- CPU 내부에 위치한 저장장치
- 일시적인 데이터를 저장하는 개별 고속 저장소 → 비쌈
- 일부 register는 특정 용도로 특별히 지정되어 있고, 나머지는 계산 중 임시 저장소로 사용
in SIC
- ⭐5 special purposed registers
24bits
- A(0, Accmulator): 산술 연산의 결과 저장
- X(1, Index register): 주소 지정에 필요한 인덱스 값 저장
- L(2, Linkage register): subroutine호출 전 return address 저장
- ⭐PC(8, Program Counter): 다음 실행 명령어 주소 저장
- SW(9, Status Word): 비교 및 조건분기(jump) 명령어에 사용되는 CC(condition code) 비트와 같은 다양한 정보 저장

- Integer:
24bit 이진수로 저장 (4byte in general)
- Character:
8bit(1byte) ASCII코드로 저장
- floating point 지원X
- SIC의 모든 명령어는
24bit 형식
- Operation code field(opcode): 하드웨어가 인식하는 고유한 번호로 명령어 종류 구분
- X filed
- Address filed: 명령어가 처리할 데이터의 메모리 주소

[Addressing Mode]
- 피연산자의 effectuve(target) memory 주소 계산 방법
in General
- 레지스터에 저장된 정보나 명령어 내의 상수 값을 사용하여 주소 결정
in SIC
- Direct addressing mode
- x bit = 0
- target address = address (명령어에 포함된 주소가 직접적으로 사용)
- Indexed addressing mode
- x bit = 1
- target address = address + (X) (명령어에 포함된 주소에 X레지스터의 값을 더하여 사용)
❗️x bit와 x register 헷갈리지 않기!
[Instruction Set]
- CPU가 인식하고 실행할 수 있는 machine code 명령어의 집합 → 프로세서에 필요한 작업 지시
- Load/Store instructions
- LDA m: 메모리 주소 m부터 m+2까지의 내용을 레지스터 A에 로드
A ⇐ (m..m+2)
- STA m: 레지스터 A의 내용을 메모리 주소 m에서 시작하는 위치에 저장
(m..m+2) ⇐ A
- Integer Arithmetic operation
- 모든 산술 연산은 레지스터 A와 메모리의 단어 간의 연산 후 레지스터 A에 저장
- ADD m
A ⇐ (A) + (m..m+2)
- SUB m
A ⇐ (A) - (m..m+2)
- MUL m
A ⇐ (A) * (m..m+2)
- DIV m
A ⇐ (A) / (m..m+2)
- Comparison
- Comp m: 레지스터 A의 값과 메모리 주소 m부터 m+2까지의 값을 비교하고, 결과에 따른 CC를 레지스터 SW에 저장
A < (m..m+2): CC = 01 (작다)
A = (m..m+2): CC = 00 (같다)
A > (m..m+2): CC = 10 (크다)
- Conditional Jump
- CC에 따라 PC를 m으로 업데이트하여 점프 (if문)
- JLT m
PC ⇐ m if CC set to <
- JEQ m
PC ⇐ m if CC set to =
- JGT m
PC ⇐ m if CC set to >
- Subroutine linkage
- JSUB m: 현재 PC값을 레지스터 L에 저장하고
L ⇐ (PC) , 서브루틴 주소 m으로 점프 PC ⇐ m
- RSUB: 레지스터 L에 저장된 주소로 PC 업데이트하여 복귀
PC ⇐ (L) ****
- I/O
- 레지스터 A의 가장 오른쪽 1byte(8bit) 를 통해 입출력 수행
- TD m: 메모리 주소 m에 지정된 장치가 데이터 전송을 준비했는지 테스트
- 준비된 경우, CC = 01 (<)
- 준비 안된 경우, CC = 00 (=)
- WD m: 메모리 주소 m에 지정된 장치에 레지스터 A의 가장 오른쪽 1byte 기록 (장치에 데이터 전송)
(m) ⇐ A[rightmost byte]
- RD m: 메모리 주소 m에 지정된 장치로부터 데이터를 읽어와 레지스터 A의 가장 오른쪽 1byte에 저장 (장치로부터 데이터 수신)
A[rightmost byte] ⇐ data from the device specified by (m)
🔹SIC/XE Architexture
[Memory]
- 최대 메모리 용량이 1MB로 늘어남 →
2^20byte
[Registers]
- SIC의 5개 레지스터+ 4개 추가 레지스터
- A, X, L, PC, SW
- B (3, Base Register): 상대 주소를 추가적으로 나타내기 위해 사용 24bits
- S, T (4, 5, General Working Register): 자유롭게 사용 가능한 일반 작업 레지스터 24bits
- F (6, Floating-point Accumulator): floting-point 계산에 사용 48bits → 실수 사용 가능
- 48bit floting-point data type도 추가적으로 사용 가능
- format1: No memory reference
1byte
- 간단 명령어, 피연산자가 없고 opcode만 포함

- format2: No memory reference
2bytes
- 레지스터 간의 연산 수행

- format3: Relative addressing
3bytes
- Flag e = 0
- opcode가 8 → 6bit로 줄어듦
- format2에서 opcode의 자리가 남아서 가장 오른쪽 두 비트가 00가 되곤 해서 없앰
- address field가 12bit
- SIC와의 호환성을 위해 3bytes로 길이를 맞추다 보니 작은 크기
- 때문에 모든 memory 위치를 표시할 수 없음

- format4: Address field extension to 20 bits
4bytes
- Flag e = 1
- address field를 20bit로 확장해서 모든 address 표현 가능

- format 3, 4에서 n, i, x, b, p, e field는 flag bits (밑에 나옴)
[Addressing Modes]
Example of addressing mode
- x, b, p, e는 TA의 값을 결정
- n, i는 TA를 어떻게 사용할건지

[Instruction Set]
- SIC의 모든 instruction사용 가능, 아래는 추가 instruction 정리
- Load/Store register
- LDB, STB: 레지스터 B 관련 로드/저장
- Floating-point arithmetic operation
- ADDF, SUBF, MULF, DIVF: 레지스터 F와 메모리의 실수값
6bytes 간의 연산 후 레지스터 F에 저장
- ADDF m
F ⇐ (F) + (m..m+5)
- Register-to-register instruction
- RMO, ADDR, SUBR, MULR, DIVR: 레지스터들을 이용한 명령어
- RMO r1, r2
r2 ⇐ (r1)
- ADDR r1, r2
r2 ⇐ (r2) + (r1)
- Supervisor call
- SVC n
- 소스 코드를 읽으며 내려가다가(=instruction 순서대로 읽음) SVC instrucion이 있으면 n값에 해당하는 interrupt가 발생하여 OS에서 이를 수행하고, 끝나면 다시 interrupt 다음 코드로 돌아옴
- n: supervisor call number (i.e. interrupt number)
- I/O
- I/O channels: CPU가 다른 instruction을 수행하고 있을 때 CPU대신 I/O작업을 수행해주는 processor → 효율적 system operation
- SIO(start), TIO(test), HIO(halt/중지)
🔸Assembly Language Statements
Assembly는 기능적으로 3가지 종류로 나눌 수 있음
- Insturctions(명령어)
- 명령어는 어셈블러에 의해 오브젝트 코드로 변환되며, 이는 런타임에 실행됨
- 각 명령어는 특정 작업에 해당
- Directives(지시어)
- 어셈블러에게 특정 작업을 수행하도록 지시
- object code에 직접적인 영향을 미치지 않음 → 주로 데이터 정의, 메타 데이터 등에 사용
- ex) WORD 지시어
- Macro(매크로)
- 다른 문장들의 시퀀스를(명령어들을) 단축하여 표현한 것
- 어셈블러는 매크로를 확장하여 해당 문장들을 생성하고 조립함
- 코드의 재사용성 높이고, 가독성 개선

🔸Actual Machine Architecture
- CISC (Complex Instruction Set Computers)
- 다양한 기능을 수행할 수 있는 크고 복잡한 명령어 제공
- 다양한 명령어 형식과 길이
- 다양한 addressing mode
- (위의 이유로) 하드웨어 구현의 복잡성
- RISC (Reduced Instruction Set Computers)
- 기계 명령어의 수가 적고, 명령어 형식과 addressing mode의 종류도 적음
- 명령어 길이가 고정
- 대부분의 명령어가 single-cycle내에 실행됨
- (위의 이유로) 간단하고 고정된 형식으로 프로세스 설계가 단순, 빠름, 저렴 + 높은 신뢰성(간단해서 오류 적음), 빠른 명령어 실행시간
🔹ARM Architecture
- ARM: Acorn RISC Machine
- ARM Ltd.에서 설계한 컴퓨터 명령어 집합 아키텍처
- 낮은 전력 소모, 효율성으로 모바일 및 임베디드 장치에서 널리 사용됨
- ARM Core
- Cortex-A: 높은 성능이 필요한 응용 프로그램을 위해 설계, 스마트폰과 테블릿에 적합
- Cortex-M: 저전력 임베디드 애플리케이션을 위해 집중 설계, IoT장치에 적합
- ARM Compiler toolchain
- ARM은 컴파일러 + 어셈블러 툴체인을 제공
- 코드를 ARM명령어에 맞춰 컴파일하고, 어셈블러가 기계어로 해석
