명령어 형식·주소지정·명령어 종류
- 약어 풀이
- ISA: Instruction Set Architecture — 명령어 집합 구조(아키텍처가 제공하는 명령어들의 규격).
- AC: Accumulator — 누산기(연산 결과를 임시로 저장하는 기본 레지스터).
- PC: Program Counter — 프로그램 카운터(다음에 실행할 명령어의 주소를 들고 있는 레지스터).
- EA: Effective Address — 유효주소(명령어 해석으로 계산된 실제 접근 주소).
- TOS: Top Of Stack — 스택의 맨 위(스택 기반 연산에서 기본 오퍼랜드 위치).
- 오퍼랜드(Operand): 연산의 재료(즉치값/레지스터/메모리 값 등 연산 대상 데이터).
1) 핵심 개념
- 컴퓨터 명령어(Instruction): CPU가 수행할 작업을 규정한 비트 필드의 집합(연산코드 + 오퍼랜드 관련 필드).
- 명령어 집합(ISA): 특정 아키텍처가 제공하는 명령어들의 전체 모음. 같은 ISA(x86 같은)면 바이너리 호환.
- 연산코드(opcode, 연산자): 무슨 작업을 할 것인가? 연산의 종류
- 오퍼랜드(operand, 연산대상, P 연산자): 어떤 값으로 수행할 것인가? 처리할 대상 데이터 또는 데이터의 주소
- 명령어 형식(Format): 필드의 종류/배치/비트수(예: opcode, addressing mode, operand, 조건비트 등).
- 오퍼랜드의 기억장소에 따른 명령어 형식과 오퍼랜드의 개수에 따른 명령어 형식으로 구분
2) 오퍼랜드 기억장소 관점의 명령어 형식
(1) 누산기(AC) 기반
- 대부분의 연산이 AC를 암묵적 목적지로 사용.
- 연산의 값 중 하나가 AC가 됨. ex) ADD X 일 때 값이 하나 같지만 누산기의 값을 포함하므로 2개의 값을 연산하게 됨.
- 예
- LOAD X → AC ← M[X]
- ADD X → AC ← AC + M[X]
- 누산기에 있는 내용과 기억장치 X번지에 있는 내용을 더해서 누산기로 전송
- STORE X → M[X] ← AC
- 장점: 형식 간단, 코드 짧음 / 단점: 유연성 떨어짐(AC 의존).
(2) 다중 레지스터 기반
- 범용 레지스터(R0…Rn)를 폭넓게 사용. 현대 ISA의 주류.
- 예
- ADD R1, R2, R3 → R3 ← R1 + R2
- 레지스터 R1의 내용과 R2의 내용을 더해서 R3로 전송
- ADD R1, R2 → R2 ← R1 + R2
- 레지스터 R1의 내용과 R2의 내용을 더해서 R2로 전송
- MOVE R1, R2 → R2 ← R1 + R2
- 레지스터 R1의 내용을 R2로 전송
- LOAD X, R1 → R1 ← M[X]
- 기억장치 X번지의 내용을 레지스터 R1에 적재
- STORE R1, X → M[X] ← R1
- 레지스터 R1의 내용을 기억장치 X번지에 저장
- ADD R1, R2, R3 → R3 ← R1 + R2
(3) 스택 기반(0-주소 스타일과 잘 맞음)
- TOS(Top Of Stack) 중심. 오퍼랜드는 암묵적으로 스택 상단 2개.
- 현재는 스택기반은 없지만 스택 구조는 유효하므로 이해 필요.
- 예
- PUSH X → TOS ← M[X]
- X 번지의 내용을 스택의 맨 위(TOS)로 전송
- ADD → TOS ← TOS + (TOS-1), 결과가 다시 TOS
- 스택의 맨 위(TOS: Top Of Stack)의 내용과 그 아래 내용(TOS-1)을 더해 스택 맨 위로 전달
- PUSH X → TOS ← M[X]
3) 오퍼랜드 수에 따른 명령어 형식
예시 목표식: X = (A + B) * C
(1) 3-주소
- 명령어에 직접 명시된 오퍼랜드의 개수가 3개인 명령어 형식
- 피연산자 2개 + 목적지 1개를 전부 명시. (연산코드 + 오퍼랜드1(피연산자) + 오퍼랜드2(피연산자) + 오퍼랜드3(목적지))
ADD A, B, R1 ; R1 ← M[A] + M[B]
MUL R1, C, X ; M[X] ← R1 * M[C]
- 장점: 명령어 수 적음 / 단점: 명령어 길이 김(오퍼랜드 3개 표기).
(2) 2-주소
- 보통 두 번째 오퍼랜드가 목적지 겸용.
- 상업용 컴퓨터에서 가장 많이 사용됨.
LOAD A, R1 ; R1 ← M[A]
ADD B, R1 ; R1 ← R1 + M[B]
MUL C, R1 ; R1 ← R1 * M[C]
STORE R1, X ; M[X] ← R1
(3) 1-주소(AC 활용)
- 오퍼랜드 1개 + AC가 암묵 목적지.
- 기억장치로부터 오퍼랜드를 가져오거나. 연산 결과를 저장하기 위한 임시 저장소로 누산기를 사용
- 명령어 실행시 연산에 사용할 오퍼랜드 1개와 연산 결과를 저장할 위치가 이미 결정된 경우
- 장점: 명령어의 길이가 짧음. / 단점: 동일한 내용을 수행할 때 경우에 따라 명령어의 개수가 증가할 수 있음.
LOAD A ; AC ← M[A]
ADD B ; AC ← AC + M[B]
STORE X ; M[X] ← AC
LOAD C ; AC ← M[C]
MUL X ; AC ← AC * M[X]
STORE X ; M[X] ← AC
(4) 0-주소(스택)
- 연산코드만 표현, 오퍼랜드 없이 스택으로 암시.
- 장점: 명령어 길이가 짧음/ 단점: 스택과 기억장치 사이를 이동하게 되어 비효율적
PUSH A
PUSH B
ADD ; (A+B) 가 TOS
PUSH C
MUL ; (A+B)*C 가 TOS
POP X
4) 주소지정방식(Addressing Modes)
유효주소(EA)를 어떻게 계산해 메모리 오퍼랜드에 접근할지를 정의.
주소지정 방식 필드를 가진 명령어 형식: 연산코드 + 주소지정방식 + 주소 혹은 오퍼랜드
- 의미(암시) 방식: 오퍼랜드를 명시하지 않음. 암시적으로 지정된 형식 (예: 스택 ADD는 TOS, TOS-1 사용).
- 즉치(Immediate): 오퍼랜드 필드 값 자체가 데이터.
예) LDI 100, R1 → R1 ← 100 - 직접(Direct): 오퍼랜드 필드가 메모리 주소.
예) LDA X → AC ← M[X] - 간접(Indirect): 오퍼랜드 필드가 EA(유효주소)가 저장된 주소.
예) LDA [X] → AC ← M[ M[X] ] - 레지스터(Register): 오퍼랜드가 레지스터에 적재되어 EA가 없음.
예) LDA R1 → AC ← R1 - 레지스터 간접(Register-Indirect): 레지스터가 EA 보유.
예) LDA (R1) → AC ← M[ R1 ] - 상대(Relative): EA = PC + disp. 분기/점프에 주로 사용. 주로 프로그램 카운터가 특정 레지스터로 사용
예) JMP $+8 - 인덱스(Indexed): EA = base + index. 배열탐색/반복연산에 주로 사용. (상대주소지정방식과 동일하게 작동하지만 기준점과 용도가 다름.)
예) LDA ARR(Ri) → AC ← M[ ARR + Ri ]
팁
- 즉치는 초기화·상수연산에 빠름(메모리 미접근).
- 간접/레지스터 간접은 간접 참조(포인터) 구현에 필수.
- 상대/인덱스는 루프·분기·배열에서 코드 밀도↑, 이식성↑.
방식 | 기호표기 | 전송문 | 유효주소 | AC 내용
-------------|----------------|------------------|---------------|--------
즉치주소 | LDA #NBR | AC ← NBR | 251 | 500
직접주소 | LDA ADRS | AC ← M[ADRS] | 500 | 800
간접주소 | LDA [ADRS] | AC ← M[M[ADRS]] | 800 | 300
상대주소 | LDA $ADRS | AC ← M[ADRS+PC] | 752 | 600
인덱스주소 | LDA ADRS(R1) | AC ← M[ADRS+R1] | 900 | 200
레지스터주소 | LDA R1 | AC ← R1 | - | 400
레지스터간접 | LDA (R1) | AC ← M[R1] | 400 | 700
5) 명령어의 종류
데이터 전송 (Data Transfer)
- Load — LD / LOAD — 기억장치(Mem) → 레지스터(Reg)로 적재.
- Store — ST / STORE — 레지스터 → 기억장치로 저장.
- Move — MOV / MOVE — 레지스터↔레지스터/레지스터↔메모리 간 복사.
- Push — PUSH — 값을 스택에 넣음(TOS 위로 SP 이동 후 저장).
- Pop — POP — 스택에서 값을 꺼냄(TOS 읽고 SP 복원).
- Input / Output — IN / OUT — I/O 포트↔레지스터 간 전송(포트 모델).
- Load Effective Address — LEA — 유효주소(EA) “값이 아닌 주소”를 레지스터에 로드.
- Exchange / Swap — XCHG / SWAP — 두 오퍼랜드의 값 교환.
데이터 처리 – 산술 (Arithmetic)
- Add — ADD — 덧셈(플래그 C/Z/S/O 갱신).
- Subtract — SUB — 뺄셈(플래그 갱신).
- Increment / Decrement — INC / DEC — +1 / −1(일부 ISA는 C 미변경).
- Multiply (Unsigned / Signed) — MUL / IMUL — 곱셈(무부호/부호).
- Divide (Unsigned / Signed) — DIV / IDIV — 나눗셈(무부호/부호).
- Add with Carry — ADC — 캐리(C)까지 포함한 덧셈(다중정밀).
- Subtract with Borrow — SBB — 캐리/차입까지 고려한 뺄셈.
- Negate — NEG — 2의 보수로 부호 반전.
- Compare — CMP — 뺄셈만 해서 플래그만 갱신(결과 미저장).
데이터 처리 – 논리/비트 (Logical & Bit Ops)
- Logical AND / OR / Exclusive OR — AND / OR / XOR — 비트 논리연산(주로 Z/S 갱신).
- Bitwise NOT — NOT — 비트 반전(1↔0).
- Test (AND then set flags) — TEST — AND 마스킹 후 결과 미저장, 플래그만 갱신.
- Bit Test/Set/Reset/Complement — BT / BTS / BTR / BTC — 특정 비트 검사/설정/리셋/토글.
- Set on Condition — SETcc — 조건 만족 시 바이트를 1/0으로 설정.
- Conditional Move — CMOVcc — 조건 만족 시 레지스터 이동.
시프트/회전 (Shift & Rotate)
- Shift Left (Arithmetic/Logical) — SAL / SHL — 왼쪽 시프트(최하위 0 주입).
- Shift Right (Logical) — SHR — 논리적 오른쪽 시프트(최상위 0 주입).
- Shift Right Arithmetic — SAR — 산술적 오른쪽 시프트(부호 유지).
- Rotate Left / Rotate Right — ROL / ROR — 회전(양끝 순환).
- Rotate through Carry Left/Right — RCL / RCR — 캐리 포함 회전(다중정밀 유용).
프로그램 제어 (Program Control & Flow)
- Jump — JMP — 무조건 분기(PC를 대상 주소로 설정).
- Jump if Zero / Not Zero — JZ(JE) / JNZ(JNE) — Z 플래그 기반 조건 분기(= / ≠).
- Jump if Carry / No Carry (Below / Above or Equal) — JC(JB) / JNC(JAE) — 무부호 비교 분기.
- Jump if Greater/Greater-Equal/Less/Less-Equal (Signed) — JG / JGE / JL / JLE — 부호 비교 분기.
- Call / Return — CALL / RET — 서브루틴 호출/복귀(복귀주소 PUSH/POP).
- Interrupt / Trap / System Call — INT / TRAP / SYSCALL — 인터럽트/트랩/시스템 호출 진입.
- Interrupt Return — IRET / IRETD — 인터럽트 복귀(플래그·PC 복원).
- No Operation — NOP — 동작 없음(타이밍/파이프라인 조정).
- Halt — HLT — 대기/저전력 상태(인터럽트로 재개).
'Computer > Computer Architecture' 카테고리의 다른 글
| 처리장치(II) (0) | 2025.10.13 |
|---|---|
| 처리장치(I) (0) | 2025.10.13 |
| 디지털논리회로(II) 및 컴퓨터 명령어(I) (0) | 2025.10.13 |
| 컴퓨터 구조의 개요 및 디지털논리회로(I) (0) | 2025.10.13 |