# [SP-5] SIC/XE 의 Addressing Mode (PC relative, Base, simple, ..)

이 글은 독자가 SIC/XE의 Instruction Format 을 이해했다는 전제하에 작성 되었습니다. SIC/XE의 Instruction Format 에 대한 내용은 이전 글 에서 확인 가능 합니다.

# standard SIC instruction

n == 0 이고 i == 0 이면 SIC의 Instruction Format 으로 간주된다.

즉 standard SIC Instruction 인 상황에서는 b, p, e bits는 flag 로 간주하는 것이 아니라, SIC Instruction Format의 Address 의 일부분이라고 생각해야함. 놓치기 좋을만한 예외상황이므로 잘 기억하고있어야한다.

# Target Address(TA) 계산을 위한 Mode

  • Base Relative

    • b == 1, p == 0 일때 Base Relative
    • TA = disp + [B]
    • disp 을 12bit unsigned integer 로 해석 (disp: 0 ~ 4095)
  • PC Relative

    • b == 0, p == 1 일때 PC Relative
    • TA = disp + [PC]
    • disp 을 12bit signed integer 로 해석 (disp: -2048 ~ 2047)
  • Direct Addressing

    • b == 0, p == 0 일때
    • TA = disp

(b 가 base 의 앞글자, p가 pc의 앞글자임을 생각하면, base, pc addressing의 조건을 바로 외울수있다. )

(주의, b == 1 이면서 동시에 p == 1 인 경우는 에러 케이스라고 간주합니다.)

(앞서 말했듯이, standard sic instruction의 조건에 만족하는 경우에는 b, p field는 Addressing Mode 결정을 위해서 쓰이지않습니다. )

  • Index Addressing
    • x == 1 일때
    • TA = disp + [X]
    • 주의. 다른 Addressing Mode 와 결합 할 수 있다
    • ex) if b == 1, p == 0, x == 1, TA = disp + [B] + [X]

# TA 해석을 위한 Mode

# Simple, Immediate, Indirect

  • Simple Addressing

    • n == 1, i == 1 일때
    • TA(Target Address)로 메모리에 접근해서 값을 가져옴
    • 예를들어, TA 가 0x123 이고 메모리 0x123 번지에는 0x030이라는 값이 들어있다면, 0x123을 사용하는 것임.
  • Immediate Addressing

    • n == 0, i == 1 일때
    • 메모리 reference 안함.
    • disp, address field 의 값을 주소 값으로 생각 안하고 그 자체를 값으로 생각함.
    • 예를들어 disp 이 0x100 이라면, 0x100 번지의 값을 쓰는 것이 아니라, 0x100 이라는 값 그 자체를 사용하는 것임.
  • Indirect Addressing

    • n == 1, i == 0 일때
    • TA 를 간접 주소로 해석한다.
    • 포인터의 동작 방식을 생각하면 이해하기 쉽다.

# Simple Addressing 추가 설명

# Indirect Addressing 추가 설명

// indirect Addressing 의 이해를 위한 c 언어 예제

int a = 10;
int* ptr = a; // 포인터 변수 ptr 에는 a 변수의 주소가 저장된다. 

printf("%d", *ptr); // 출력: 10

// 10 이라는 값이 출력되기까지의 과정을 알고있다면 Indirect Addressing 을 알고있다고 볼수있다.

// 1. 포인터 변수 ptr 에 저장된 값을 불러온다. 이는 a 변수의 주소 값이다
// 2. a 변수의 주소값을 통해 a 변수로 접근
// 3. a 변수에 저장된 값인 10을 불러온다. 
// 4. 10을 출력한다.

// indirect Addressing 을 위한 예시

disp = 0x123 
메모리 0x123 번지에 저장된 내용 = 0x200
메모리 0x200 번지에 저장된 내용 = 0x300

일때 indirect addressing 을 한다면?

1. 메모리 0x123 번지에 저장된 값을 불러온다. 이는 0x200 이다
2. 0x200번지에 저장된 값을 불러온다. 이는 0x300 이다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# Assembly 코드 레벨에서 Indirect, Immediate 구분

    J @RETADR 
    . @ 가 붙으면 Indirect Addressing

    COMP #1
    . # 이 붙으면 Immediate Addressing
1
2
3
4
5