[시스템프로그래밍] 2. Assembler (2)

jungizz_·2025년 4월 25일

System Programming

목록 보기
3/8
post-thumbnail

🔸 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과 변환 과정을 살펴본다.

Format 2

ex) Register-to-register Instruction

  1. mnemonic operation code를 machine language로 변환 (OPTAB을 사용)
    • COMPR → A0
  2. 각 레지스터 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

Format 3

  • 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)
  1. mnemonic operation code를 machine language로 변환
  2. 먼저 PC relative addressing mode로 disp 계산
    1. disp가 범위를 초과하는 경우 Base relative addressing mode를 사용
    2. 두 relative mode 모두에서 변위가 유효하지 않으면 오류 메세지 생성
  3. Prefix 및 index 등을 파악해서 n, i, x, b, p, e 확인

ex) Register-to-memory Insturctions - PC relative addressing (1)

  1. STL → 14
  2. 먼저, PC relative addressing으로 시도
    • TA: RETADR의 주소 30
    • PC: 0000의 다음 instruction address 0003
    • disp: TA - PC = 30 - 3 = 2D → 12bit filed에 표현 가능 → b=0, p=1
  3. prefix가 없으므로
    • simple addressing → n=i=1
    • format3 (prefix ‘+’가 없음) → e=0
  4. index addressing 아님 → x=0

ex) Register-to-memory Insturctions - PC relative addressing (2)

  1. J→ 3C
  2. 먼저, PC relative addressing으로 시도
    • TA: CLOOP의 주소 6
    • PC: 0017의 다음 instruction address 001A
    • disp: TA - PC = 6 - 1A = -14 → 12bit filed에 표현 가능(2의보수) → b=0, p=1
  3. prefix가 없으므로
    • simple addressing → n=i=1
    • format3 → e=0
  4. 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

  1. STCH → 54
  2. 먼저, PC relative addressing으로 시도
    • TA: BUFFER의 주소 36
    • PC: 104E의 다음 instruction address 1051
    • disp: TA - PC = 36 - 1051 = -101B → hex가 4개 필요하므로 address field가 3byte인 format3으로 표현 불가능
  3. 다음으로, 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
  4. prefix가 없으므로
    • simple addressing → n=i=1
    • format3 → e=0
  5. X가 index addressing으로 사용 → x=1

Format 4

  • PC, base relative addressing이 모두 사용될 수 없는 경우 = addressing filed에 들어가는 값이 3byte를 넘을 때
  • addressing filed를 4byte로 확장 → displacement 계산 필요X (상대 주소가 아닌, 전체 메모리 주소 표현이 가능해서), 절대 주소 넣음
  • prefix ‘+’
    • 만약 프로그래머가 ‘+’ prefix를 명시하지 않은 경우: 어셈블러는 Format3로 인지하고 PC relative address → Base relative → 오류메세지 생성 과정을 거치게 됨

ex) format4 Insturction

  1. JSUB→ 48
  2. prefix ‘+’
    • format4 → e=1
    • 다른 prefix는 없으므로 simple addressing → n=i=1
  3. format 4는 relative addressing이 아니므로 x=b=p=0
  4. 나머지 20bit에 RDREC의 주소 1036 바로 들어감

Immediate Addressing Instructions

  • 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)이 필요한 부분에 대해 알려줌
    1. 어셈블러는 로더가 일부 instruction의 address field에 시작 주소를 추가하도록 하는 명령 생성 → 이 명령은 object program의 일부가 됨(modification record)
    2. 이후 로더는 프로그램 시작과 관련된 주소를 생성하고 명령을 수정함

🔹 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을 보고^^

profile
( •̀ .̫ •́ )✧

0개의 댓글