🔸 SIC/XE Assembly
🔹 Instructions
- Indirect addressing
@
- Immediate operands
#
- Format 4 instruction
+
- assembler directive BASE는 relative addressing과 함께 사용
example of SIC/XE Assembly Program
- SIC와 차이점 위주로!

Differences with SIC
이전 SIC 예제 코드와 위 SIC/XE 예제 코드의 차이점 → 이를 통해 프로그램 실행 속도 향상
- Register-to-register instruction 사용 (아래 설명)
- Register-to-memory operation보다 빠름
- instruction이 format2로 길이가 짧고, 추가 메모리 참조가 필요 없으므로 전체적 성능 향상

- immediate addressing 사용
- 연산자의 값이 명령어의 일부로 포함되어 있어 추가적으로 메모리에서 가져올 필요가 없음 (fetch할 필요가 없음)
- indirect addressing 사용
- 추가 명령어를 사용하지 않고 간단하게 연산 가능
- Line 70에서의
J @RETADR: 이 떄의 Return address는 2A이다. (위의 instruction에서 WRREC로 점프 서브루틴 했으므로) 2A 주소값에 해당하는 위치로 점프한다. 근데 그게 자기 자신이라서 계속 도는 것 → 종료
🔹 Object Code
❗pc 값은 현재 instruction의 다음 Loc값을 가진다는 것 기억하기
꿀팁!
- object에서 첫 두자리 16진수 값(opcode, n, i flag)에 opcode값을 뺀 결과에 따라 n, i가 0인지 1인지 쉽게 알 수 있음
- 또는, Prefix에 따라 알 수 있음
- 0(no prefix): Simple addressing for SIC
- 1(#): Immediate addressing
- 2(@): Indirect addressing
- 3(+): Simple addressing for SIC/XE
- 그 뒤 세번째 16진수 값 (x, b, p, e)의 값에 따라 속성을 쉽게 확인할 수 있음
- 2: PC-relative
- 4: base-relative
- 8: index(m, X)
- 1: extended
🔹 Translation of Instructions
Instruction은 format1~4의 다양한 형태를 가지고, 각 형태마다 어셈블러가 object code로 변환하는 과정이 다르다. 각 format에 해당하는 instruction과 변환 과정을 살펴본다.
ex) Register-to-register Instruction
- mnemonic operation code를 machine language로 변환 (OPTAB을 사용)
- 각 레지스터 mnemonic을 해당하는 숫자 값으로 변경 (이를 위해서 SYMTAB에 레지스터 이름과 그에 해당하는 값이 미리 로드되어있다)
- ex) register: A(0), X(1), L(2), B(3), S(4), T(5), F(6), PC(8), SW(9)
- A → 0
- S → 4

- pc 또는 base relative addressing mode로 assemble됨
- TA = (PC) or (B) + displacement
- 위 과정에서 displacement는 address filed의 12-bit filed에 맞도록 충분히 작아야 함
- Base relative (disp: 0~4095)
- PC relative (disp: -2048~2047)
- mnemonic operation code를 machine language로 변환
- 먼저 PC relative addressing mode로 disp 계산
- disp가 범위를 초과하는 경우 Base relative addressing mode를 사용
- 두 relative mode 모두에서 변위가 유효하지 않으면 오류 메세지 생성
- Prefix 및 index 등을 파악해서 n, i, x, b, p, e 확인
ex) Register-to-memory Insturctions - PC relative addressing (1)
- STL → 14
- 먼저, PC relative addressing으로 시도
- TA: RETADR의 주소 30
- PC: 0000의 다음 instruction address 0003
- disp: TA - PC = 30 - 3 = 2D → 12bit filed에 표현 가능 → b=0, p=1
- prefix가 없으므로
- simple addressing → n=i=1
- format3 (prefix ‘+’가 없음) → e=0
- index addressing 아님 → x=0

ex) Register-to-memory Insturctions - PC relative addressing (2)
- J→ 3C
- 먼저, PC relative addressing으로 시도
- TA: CLOOP의 주소 6
- PC: 0017의 다음 instruction address 001A
- disp: TA - PC = 6 - 1A = -14 → 12bit filed에 표현 가능(2의보수) → b=0, p=1
- prefix가 없으므로
- simple addressing → n=i=1
- format3 → e=0
- index addressing 아님 → x=0

💡PC relative addressing vs Base relative addressing
- 어셈블러는 실행 시 PC의 내용을 항상 알고 있음 (다음 instruction의 주소)
- but, Base register는 프로그래머가 관리 → 프로그래머는 어셈블러가 displacement를 계산할 수 있도록 실행 중에 base register가 무엇을 포함할 것인지 어셈블러에게 알려줘야함
- 위 작업이 어셈블러 directive BASE
- directive NOBASE를 사용하여 B register를 해제할 수 있음
ex) Register-to-memory Insturctions - BASE relative addressing
- STCH → 54
- 먼저, PC relative addressing으로 시도
- TA: BUFFER의 주소 36
- PC: 104E의 다음 instruction address 1051
- disp: TA - PC = 36 - 1051 = -101B → hex가 4개 필요하므로 address field가 3byte인 format3으로 표현 불가능
- 다음으로, BASE relative addressing 시도
- TA: BUFFER의 주소 36
- LDB #LENGTH → LENGTH의 주소값인 33이 immediate addressing으로 B register에 저장 (B: 33)
- disp: TA - B = 36 - 33 = 3 → 표현 가능 → b=1, p=0
- prefix가 없으므로
- simple addressing → n=i=1
- format3 → e=0
- X가 index addressing으로 사용 → x=1

- PC, base relative addressing이 모두 사용될 수 없는 경우 = addressing filed에 들어가는 값이 3byte를 넘을 때
- addressing filed를 4byte로 확장 → displacement 계산 필요X (상대 주소가 아닌, 전체 메모리 주소 표현이 가능해서), 절대 주소 넣음
- prefix ‘+’
- 만약 프로그래머가 ‘+’ prefix를 명시하지 않은 경우: 어셈블러는 Format3로 인지하고 PC relative address → Base relative → 오류메세지 생성 과정을 거치게 됨
- JSUB→ 48
- prefix ‘+’
- format4 → e=1
- 다른 prefix는 없으므로 simple addressing → n=i=1
- format 4는 relative addressing이 아니므로 x=b=p=0
- 나머지 20bit에 RDREC의 주소 1036 바로 들어감

- n=0, i=1, prefix ‘#’
- memonic을 machine code로 바꾸고 +1
- 메모리 참조가 없기 때문에 더욱 간단
어셈블러는 operand를 즉시 instruction에 삽입
- LDA → 00, i=1이므로 +1
- x=b=p=e=0
- operands의 값을 직접 address filed에 넣어주기
operand가 너무 커서 12bit를 넘는 경우, 20bit extended instruction format(format4)가 호출됨 (20bit도 넘으면 오류)
- LDT → 74, i=1이므로 +1
- x=b=p=0, e=1
- 4096(10진수) → 01000(16진수)
operand가 symbol인 경우 해당 주소 값이 instruction에 삽입
- LDB → 68, i=1이므로 +1
- TA(33) - PC(6) = 2D → PC relative addressing → b=0, p=1
- x=e=0
🔸 Program Relocation (Loader)
- Multi programming
- 메모리 및 기타 리소스를 공유하면서 한 번에 두 개 이상의 프로그램을 실행 → 메모리에 여러 프로그램이 동시에 올라와있음
- 프로그램이 올라올 공간만 있다면 어디든 메모리에 로드될 수 있지만, 겹치거나 공간이 낭비되지 않게끔 메모리를 사용해야함
- 위에서 본 예시들의 Loc값은 프로그램 내부에서의 위치일 뿐, 메모리에 올라온 프로그램의 statement 위치가 아님
- 어셈블러는 프로그램이 메모리에 로드될 때, 메모리의 실제 위치를 알 수 없음 → 로드되기 전까지 알 수 없다
- 그래서 재배치가 필요하다!
- relative addressing은 상관 없지만, prefix ‘+’를 사용한 format 4의 instruction에서는 TA?가 프로그램이 어디에 로드되었냐에 따라 Object code가 완전 달라짐
- 그래서 format4는 address filed값에 프로그램의 시작 주소를 더해야한다 → Program Relocation
- 어셈블러가 아닌, 로더(Loader)가 수행
- 어셈블러는 로더에게 object program의 수정(relocation)이 필요한 부분에 대해 알려줌
- 어셈블러는 로더가 일부 instruction의 address field에 시작 주소를 추가하도록 하는 명령 생성 → 이 명령은 object program의 일부가 됨(modification record)
- 이후 로더는 프로그램 시작과 관련된 주소를 생성하고 명령을 수정함
🔹 Modification record
- 구성
- col. 1: M
- col. 2-7: 프로그램 시작에 비례하여 수정될 address field의 시작 위치(16진법)
- 수정할 address field의 맨 왼쪽 비트도 포함하는 위치! (object code의 맨 왼쪽 비트를 포함하는 위치인 것 샅은데?)
- col. 8-9: 수정할 address field의 길이, half-bytes(16진법)
- 수정이 필요없는 instruction
- operand가 메모리 주소가 아닌 경우 (CLEAR S)
- operand가 relative addressing을 사용하여 지정된 경우 (STL RETADR)
❗️즉, 로드 시 수정이 필요한 부분은 직접 주소로 지정하는 부분뿐이다.
시작 위치는 어케 보는건지.. → 어셈블리 코드의 LOC을 보고^^