이론/컴퓨터구조
명령어 특성
ohojee
2023. 11. 6. 00:44
명령어란?
- 컴퓨터가 수행할 수 있는 동작을 2진 코드로 정의(아키텍쳐마다 다름)
- 구성
- 연산 부호: cpu가 실행할 동작 ex) 덧셈, 뺄셈, 저장, 분기, etc
- 피연산자: 연산의 대상이 되는 데이터 or 데이터의 위치 ex) 메모리 주소, 레지스터 번호, 상수 값, 입출력 포트
명령어 길이 형식
고정길이 | 가변길이 | |
---|---|---|
명령어 길이 | 모두 동일 | 명령어의 종류/구성요소에 따라 다양 |
해석 | 쉬움 | 어려움 |
프로그램 설계 | 단순 | 복잡 |
프로그램 낭비 | o ⇒ 짧게 표현 가능해도 길이 맞춰야함 | x |
사용 아키텍쳐 (ISA) | RISC(Reduced) | CISC(Complicated) |
피연산자 수에 따른 명령어 형식
- 컴퓨터에 따라 다름
3-주소 명령어 형식
opcode | operand(target) | operand(source1) | operand(source2) |
---|
- ex) Y = A * B + C * D
MUL R1, A, B // R1 <- A * B MUL R2, C,D // R2 <- C * D ADD Y, R1, R2 // Y <- R1 + R2
- 특징
- 명령어 길이 ⬆️
- 명령어 개수 ⬇️
- 2, 3주소는 모두 범용레지스터 사용(여러 개의 레지스터 존재)
2-주소 명령어 형식
opcode | operand(source-target) | operand(source2) |
---|
- ex) Y = A * B + C * D
LOAD R1, A // R1 <- A MUL R1, B // R1 <- R1 * B LOAD R2, C // R2 <- C MUL R2, D // R2 <- R2 * D ADD R1, R2 // R1 <- R1 + R2 STORE Y, R1 // Y <- R1
- 특징
- source와 target 동일하게 사용
- 명령어 길이 ⬇️
- 명령어 개수 ⬆️
1-주소 명령어 형식
opcode | operand |
---|
- ex) Y = A * B + C * D
LOAD A // Acc <- A MUL B // Acc <- Acc * B STORE T // T <- Acc LOAD C // Acc <- C MUL D // Acc <- Acc * D ADD T // Acc <- Acc + T STORE Y // Y <- Acc
- 특징
- 레지스터 1개 <= 이 레지스터는 누산기
- source와 target 동일하게 사용
- 명령어 길이 ⬇️(Acc 생략)
- 명령어 개수 ⬆️(제일 많음)
- 초기 컴퓨터에서 사용, 지금은 x
0-주소 명령어 형식
- 스택 사용하는 계산기에서 사용하는 명령어 형식
- ADD, MUL 등의 연산자는 stack에서 두 개의 데이터를 pop하여 계산하고 그 결과를 다시 push
- 명령어 길이를 줄이는 방법
- 메모리 주소 대신 레지스터 주소 사용
- 메모리 용량 >>>> 레지스터 용량 ⇒ 레지스터 주소는 매우 적은 비트로 표현 o
- 16bit 메모리면 항상 메모리는 16bit로 표현, but 레지스터는 8개라고 한다면 000으로 3bit로 표현 o
- 2-주소 명령어
- source 연산자 하나를 target과 겸함 ⇒ 3-주소 명령어보다 길이 ⬇️
- 1-주소 명령어
- 묵시적 피연산자 사용
- Acc(누산기) 생략 ⇒ 길이 ⬇️
- but 최종적으로 효과적이냐는 의문 존재
- 메모리 주소 대신 레지스터 주소 사용
명령어 사이클
폰노이만 모델
- CPU, 메모리, 입출력장치로 구성
가상컴퓨터 AccCom의 CPU 구성

- 제어장치
- PC(program counter): 프로그램 계수기
- 다음에 실행해야할 명령어의 주소 가짐❓그럼 프로그램 처음 시작하면 pc에 누가 넣어줌? ⇒ os가 pc에 프로그램의 시작 주소 넣어줌
- 다음에 실행해야할 명령어의 주소 가짐
- IR(instruction register): 명령어 레지스터
- PC(program counter): 프로그램 계수기
- 연산장치
- Acc(accumulator): 누산기
- 메모리 인터페이스
- MAR(memory address register): 메모리 주소 레지스터
- MBR(memory buffer register): 메모리 버퍼 레지스터
가상컴퓨터의 명령어 형식과 데이터 형식

- 명령어 형식
- 16bit 고정 길이 명령어
- 메모리 주소: 0x0000~0x0FFF
- 데이터 형식
- 16bit 부호-크기 방식의 정수
- 정수: -32767 ~ -0, 0 ~ 32767
- 연산: add, sub, mul
가상 컴퓨터의 명령어 목록

명령어 사이클의 종류
- 인출 사이클: 메모리 → cpu로 명령어 가져오기
- 실행 사이클: cpu에서 명령 실행
- 인터럽트 사이클: 인터럽트 발생 시 서비스 루틴 실행
⇒ 프로그램 실행은 인출 사이클 → 실행 사이클
반복
인출 사이클
- 메모리 → cpu로 명령어 가져오기
- pc에 저장된 명령어 메모리 주소 → mar
- 메모리는 mar이 지정하는 주소에 있는 데이터(명령어)를 mbr에 저장 (버스로 보내면 자동으로 mbr에 저장)
- mbr의 명령어 → ir에 저장
- pc에 다음 명령어 주소로 갱신
실행 사이클
- cpu에서 명령 실행(명령어에 따라 다르긴 함)
- ex) 읽기 명령어(LDA(load))
- 프로세서는 데이터가 있는 메모리 주소를 MAR에 지정
- 메모리는 MAR이 지정하는 메모리 주소에 있는 데이터를 MBR에 저장
- 프로세서는 MBR에 저장된 데이터를 Acc에 저장
- ex) 쓰기 명령어(STA(store))
- 프로세서는 데이터가 있는 메모리 주소를 MAR에 지정
- 프로세서는 Acc의 데이터를 MBR에 저장
- 메모리는 MAR이 지정하는 메모리 주소에 MBR의 내용을 저장
- ex) 덧셈 명령어(ADD)
- IR에 저장된 명령어에서 피연산자 주소 부분을 MAR에 지정
- 메모리는 MAR이 지정하는 주소에 있는 데이터를 MBR에 저장
- MBR의 데이터와 Acc의 데이터를 더하고 그 결과를 다시 Acc에 저장
- ex) 읽기 명령어(LDA(load))
예제


- MAR ← IR[11:0]: 11bit부터 0bit까지 슬라이싱해서 MAR에 전달


인터럽트(용어정도만 기억하면 됨)
- CPU가 컴퓨터 내부 또는 외부에서 발생할 수 있는 갑작스런 사건에 대응하는 기능
- 인터럽트가 발생 → 상태 레지스터에 인터럽트 발생을 표시
- 명령어 실행 단계가 끝날 때마다 인터럽트 발생을 확인 → if 인터럽트 발생 ? 현재 CPU 상태를 저장, 해당 인터럽트 서비스 루틴을 실행 : continue
- 인터럽트 서비스 루틴의 실행을 마치고, 이전 CPU 상태로 복귀
- 내부 인터럽트의 종류
- 하드웨어 고장
- 실행할 수 없는 명령어
- 명령어 실행 오류 ex) 0으로 나누기
- 사용 권한 위배
- 외부 인터럽트의 종류
- 타이머 인터럽트: 프로세스 스케줄링 또는 예약 작업 처리. 워치독
- 입출력 인터럽트: 입출력 장치의 상태 변화 알림
Uploaded by N2T