[시스템프로그래밍] Assembly Code를 Machine Language로 변환하기

장다희·2025년 4월 14일

시스템프로그래밍

목록 보기
7/9

🟡 레지스터 간 (Register-to-Register) Instruction의 변환

  1. mnemonic operation code → 기계어 코드
  2. 각 레지스터 이름을 해당 숫자 값으로 변환
    → 보통 SYMTAB에 미리 정의
    → A(0), X(1), L(2), B(3), S(4), T(5), F(6), PC(8), SW(9)
  • 예;
    명령어 COMPR A,S 는 object code A004 로 변환된다.
    → COMPR: A0, A레지스터: 0, S레지스터: 4

🟡 Register-to-Memory Instruction의 변환

Format 3 명령어 중 메모리를 참조하는 명령어
일반적으로 PC-relative 또는 Base-relative addressing mode를 사용해 어셈블된다.

→ 어셈블러는 정확한 Target Address를 얻기 위해 displacement(변위)를 계산해야 한다.
Target Address = (PC) or (B) + disp

계산된 displacement는 Format 3 명령어의 12비트 field에 들어갈 수 있을 만큼 작아야 한다.

  • PC-relative: displacement 범위 -2048 ~ +2047 (-0x800 ~ +0x7FF)
  • Base-relative: displacement 범위 0 ~ 4095 (0 ~ 0xFFF)

🟡 Immediate Addressing Instruction

Immediate Addressing을 사용하는 명령어는 메모리 참조가 필요 없기 때문에 어셈블 과정이 간단함

  • 피연산자가 상수인 경우
    → 어셈블러는 즉시 피연산자 값을 내부 표현으로 변환하여 명령어 안에 삽입

  • 피연산자 값이 너무 커서 12비트 displacement에 들어가지 못할 경우
    → 4바이트(20비트 주소 필드)의 Format 4 명령어를 사용해야 함

    • 만약 20비트 주소 필드에도 너무 크다면?
      → 피연산자 값을 메모리 상의 어떤 위치에 저장하고, relative or direct addressing 사용
  • 피연산자가 symbol인 경우
    → 해당 symbol의 주소 값이 명령어에 삽입됨
    → 필요하다면 displacement 계산이 수행됨

    • Opcode: 0x69
      0x68 + 0x01 (Immediate addressing이므로 i 비트= 1)

    • xbpe 비트: 0010 → 0x2
      PC-Relative addressing이므로 p비트= 1

    • displacement: 0x02D
      = Target Address - (PC)
      = 0x33 - 0x06
      = 51 - 6
      = 45
      = 0x2D

Assembler의 Format 3 명령어 번역 시도 순서

1️⃣ PC-relative 가능한지 확인, 가능하다면 사용

2️⃣ 필요한 displacement가 PC-relative 범위를 벗어날 경우, Base-relative 방식 사용

3️⃣ 양쪽 방식 모두에서 displacement가 유효하지 않으면, 오류 메시지를 출력


🟡 PC Relative Addressing

  • PC 레지스터 값: Instruction은 3bytes를 차지하므로 0x003

  • displacement
    = target address - (PC)
    = 0x030 - 0x003
    = 0x02D
    = 000000101101

  • Opcode (8bits)
    STL의 Opcode는 14이고, n=1, i=1 (Simple addressing) 이므로
    0x14+0x03=0x17이다.

  • xbpe 비트 (4bits)
    pc-relative이므로 x=0, b=0, p=1, e=0
    → 0010
    → 0x2

  • displacement (12bits)
    0000 0010 1101
    = 0x02D

  • Opcode(8bits)
    J의 Opcode는 3C이고, n=1, i=1 (Simple addressing) 이므로
    0x3C+0x03=0x3F이다.

  • xbpe 비트 (4bits)
    pc-relative이므로 x=0, b=0, p=1, e=0
    → 0010
    → 0x2

  • PC 레지스터 값: Instruction은 3bytes를 차지하므로 0x020

  • displacement
    = target address - (PC)
    = 0x006 - 0x01A
    = -0x014
    = 1111 1110 1100
    = 0xFEC

2의 보수 구하기
1️⃣ 1's complement (비트 반전)
0000 0001 0100 ➝ 1111 1110 1011

2️⃣ +1

  1111 1110 1011  
  +            1  
  ——————————————  
  1111 1110 1100  

🟡 Base Relative Addressing

Base-relative 주소 지정에서의 displacement 계산 과정은
PC-relative 주소 지정과 매우 유사하다.

어셈블러는 실행 시점에 Program Counter(PC)의 값이 무엇일지 알고 있는 반면,
Base Register(B)는 프로그래머가 제어한다.

→ 어셈블러가 displacement를 계산할 수 있도록 프로그래머는 실행 중 Base register가 어떤 값을 갖게 될지를 알려줘야 한다.

이 역할은 어셈블러 지시어 BASE로 수행된다.

NOBASE 지시어를 사용하면 B 레지스터를 해제할 수 있다.


BASE LENGTH는 어셈블러에게
base register에 LENGTH의 주소가 저장될 것임을 알려준다.
앞선 명령어인 LDB #LENGTH가 이 값을 B 레지스터에 로드한다.

  • Opcode (8bits)
    STCH의 Opcode는 54이고, n=1, i=1 (Simple addressing) 이므로
    0x54+0x03=0x57이다.

  • xbpe 비트 (4bits)
    Index addressing, Base-relative이므로 x=1, b=1, p=0, e=0
    → 1100
    → 0xC


1️⃣ PC-relative 가능한지 확인
  • PC 레지스터 값: Instruction은 3bytes를 차지하므로 0x1052

  • displacement
    = target address - (PC) - (X)
    = 0x36 - 0x1052 - 0
    = 54 - 4128
    = -4124 (10진수)

-4124는 PC-relative로 변환 가능한 범위를 넘어섰다. 그러므로 다음 단계로 넘어가도록 한다.

2️⃣ Base-relative 방식 사용

  • displacement
    = target address - (B) - (X)
    = 0x036 - 0x033
    = 0x003

Format 4 Instruction 변환

PC-relative나 Base-relative 주소 지정 방식을 사용할 수 없는 경우, 즉 두 방식 모두 필요한 displacement가 3바이트 명령어에 들어갈 수 없을 만큼 너무 큰 경우에는 Format 4를 사용해야 한다.

Format 4 (4bytes) 는 20bits 주소 필드를 포함하며, 이는 전체 메모리 주소를 담기에 충분하다.

이 경우에는 displacement 계산이 필요 없다!

단, 프로그래머가 반드시 접두사 +를 사용해 확장 포맷을 지정해야 한다.
만약 지정하지 않는다면?

→ 어셈블러는 명령어를 Format 3 변환 과정을 따라 시도하게 된다.

0x1036은 10진수로 4166이므로 PC-relative도, Base-relative도 적용할 수 없다. 그러므로 Format 4를 이용해야 한다.

  • Opcode
    0x48 + 0x03 = 0x4B

  • xbpe
    Format 4이므로 x=0, b=0, p=0, e=1
    → 0001
    → 0x1

  • address (20bits)
    0x01036

0개의 댓글