본문 바로가기
Computer/Computer Architecture

컴퓨터 명령어(II)

by curious week 2025. 10. 13.

명령어 형식·주소지정·명령어 종류

  • 약어 풀이
    • 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번지에 저장

(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)을 더해 스택 맨 위로 전달

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)

  • LoadLD / LOAD — 기억장치(Mem) → 레지스터(Reg)로 적재.
  • StoreST / STORE — 레지스터 → 기억장치로 저장.
  • MoveMOV / MOVE — 레지스터↔레지스터/레지스터↔메모리 간 복사.
  • PushPUSH — 값을 스택에 넣음(TOS 위로 SP 이동 후 저장).
  • PopPOP — 스택에서 값을 꺼냄(TOS 읽고 SP 복원).
  • Input / OutputIN / OUT — I/O 포트↔레지스터 간 전송(포트 모델).
  • Load Effective AddressLEA — 유효주소(EA) “값이 아닌 주소”를 레지스터에 로드.
  • Exchange / SwapXCHG / SWAP — 두 오퍼랜드의 값 교환.

데이터 처리 – 산술 (Arithmetic)

  • AddADD — 덧셈(플래그 C/Z/S/O 갱신).
  • SubtractSUB — 뺄셈(플래그 갱신).
  • Increment / DecrementINC / DEC — +1 / −1(일부 ISA는 C 미변경).
  • Multiply (Unsigned / Signed)MUL / IMUL — 곱셈(무부호/부호).
  • Divide (Unsigned / Signed)DIV / IDIV — 나눗셈(무부호/부호).
  • Add with CarryADC — 캐리(C)까지 포함한 덧셈(다중정밀).
  • Subtract with BorrowSBB — 캐리/차입까지 고려한 뺄셈.
  • NegateNEG — 2의 보수로 부호 반전.
  • CompareCMP — 뺄셈만 해서 플래그만 갱신(결과 미저장).

데이터 처리 – 논리/비트 (Logical & Bit Ops)

  • Logical AND / OR / Exclusive ORAND / OR / XOR — 비트 논리연산(주로 Z/S 갱신).
  • Bitwise NOTNOT — 비트 반전(1↔0).
  • Test (AND then set flags)TEST — AND 마스킹 후 결과 미저장, 플래그만 갱신.
  • Bit Test/Set/Reset/ComplementBT / BTS / BTR / BTC — 특정 비트 검사/설정/리셋/토글.
  • Set on ConditionSETcc — 조건 만족 시 바이트를 1/0으로 설정.
  • Conditional MoveCMOVcc — 조건 만족 시 레지스터 이동.

시프트/회전 (Shift & Rotate)

  • Shift Left (Arithmetic/Logical)SAL / SHL — 왼쪽 시프트(최하위 0 주입).
  • Shift Right (Logical)SHR — 논리적 오른쪽 시프트(최상위 0 주입).
  • Shift Right ArithmeticSAR — 산술적 오른쪽 시프트(부호 유지).
  • Rotate Left / Rotate RightROL / ROR — 회전(양끝 순환).
  • Rotate through Carry Left/RightRCL / RCR — 캐리 포함 회전(다중정밀 유용).

프로그램 제어 (Program Control & Flow)

  • JumpJMP — 무조건 분기(PC를 대상 주소로 설정).
  • Jump if Zero / Not ZeroJZ(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 / ReturnCALL / RET — 서브루틴 호출/복귀(복귀주소 PUSH/POP).
  • Interrupt / Trap / System CallINT / TRAP / SYSCALL — 인터럽트/트랩/시스템 호출 진입.
  • Interrupt ReturnIRET / IRETD — 인터럽트 복귀(플래그·PC 복원).
  • No OperationNOP — 동작 없음(타이밍/파이프라인 조정).
  • HaltHLT — 대기/저전력 상태(인터럽트로 재개).