본문 바로가기
시스템 프로그래밍

Assemblers (2)

by sepang 2021. 10. 14.

  저번 포스팅에서 SIC 버전의 어셈블러에 대해 알아보았다. 이번에는 SIC/XE 버전 어셈블러에 대해 알아볼건데, 전 포스팅에서 봤던 어셈블리어 프로그램이 SIC/XE 버전에서 어떻게 변하는지 살펴보면서 알아보자. 전에 SIC/XE가 SIC와 어떤 차이점이 있는지도 살펴보았으니 이를 떠올리면서 시작해보자.

 

Machine-dependent Assembler Features

  저번에 어셈블러는 instruction format과 addressing mode에 따라 설계나 특징이 달라진다고 한 것이 기억나는지 모르겠다. 어쨌든 이렇게 어셈블러는 기계의존적이기 때문에 어떤 기계를 쓰느냐에 따라 차이를 보인다. 밑에 보여줄 그림은 SIC/XE instruction set을 이용하여 이전에 SIC로 작성했던 어셈블리어 프로그램을 다시 구성한 것이다. 몇가지 특징을 확인해보고 그림을 봐보자.

  • indirect addressing은 피연산자에 접두사 '@'를 붙여서 나타낸다. (Ex. J   @RETADR)
  • immediate operands는 접두사 '#'를 붙여서 나타낸다. (Ex. COMP   #0)
  • format 4 instructionb(=4-byte extended format)은 operation code에 '+'를 붙여서 나타낸다. (Ex. +JSUB   RDREC)
  • assembler directive 'BASE'는 relative addressing과 함께 사용된다. (Ex. BASE   LENGTH)

  어떠한 addressing mode를 사용하는가는 프로그래머에게 달려있다.

 

SIC/XE Assembly Program with Object Code

fig 1

  밑에서 SIC 버전과의 차이에 대해 자세히 말할거지만 몸풀기 느낌으로 Loc:0000만 한 번 봐보자. 'FIRST  STL  RETADR'이 '17202D'로 변환된다. 16진수 6개로 이루어져 있으니 24bits의 크기를 가진다. 즉 format 3 instruction이다.

fig 2. format 3 instruction

  우선 STL의 opcode값은 '14(16진수)'이다. 이진수로 표현하면 '0001 0100'인데 opcode filed 크기는 fig 2를 보면 알 수 있듯이 6bit 이다. 즉 opcode의 '0001 0100'중에서 뒤의 '00'이 생략되어 있다는 것을 알 수 있다. 실제로 instruction set을 살펴보면 모든 opcode의 마지막 두자리는 이진수로 변환해보면 모두 '00'으로 끝나는 것을 알 수 있다.

  그리고 해당 구문은 피연산자의 prefix가 따로 표시되어 있지 않으므로 simple addressing을 사용한다. 즉 'n=i=1'이다.  때문에 object code의 앞의 17은 '0001 0111'이 되는 것이다. 

  그다음 나머지 4개의 flag bit(x,b,p,e)에 해당하는 field를 살펴보면 4개중 p만 '1'임을 알 수 있다. 즉 pc relative addressing을 사용한다.

  이제 마지막 필드인 displacement를 보자. PC값에 disp값을 더하면 TA(Target Address)가 나와야한다. 즉 'TA = (PC) + disp"이다. 때문에 disp값을 얻으려면 TA에서 PC의 값을 빼면 된다(disp=TA-(PC)). 여기서는 '30-3=2D'이므로 disp의 값은 2D이다. PC값은 현재 instruction의 다음 Loc값을 가짐을 기억하자.

  이제 위의 예시로 SIC/XE assembler의 특징을 계속 살펴보도록 하자.

 

※The magic

  그 전에 유용한 팁을 하나 확인하고 넘어가자.

fig 3

  format 3, 4 instruction에서 opcode field의 크기가 6bit이고 뒤의 n, i flag bit가 덧붙여져서 16진수 2자리로 변환되는 것을 위에서 확인했다. 때문에 그 두자리의 16진수 값에 opcode값을 빼서 n, i가 0인지 1인지 쉽게 알 수 있다.

 

What does SIC/XE Assembler Do?

  본격적으로 차이점에 대해 설명해보자. 위의 예시 프로그램의 SIC버전과 SIC/XE버전은 크게 2가지 차이점이 있다.

  • 가능하다면 register-to-register instructions을 사용한다.
    • Ex) COMP  ZERO (in SIC ver.)  ->  COMPR  A,S (in SIC/XE ver.)
  • 가능하다면 immediate & indirect addressing을 사용한다

  이러한 변경점들은 프로그램의 실행 속도를 향상시키기 위해 개선된 SIC/XE 아키텍처를 활용한 것이다. 우선 register-to-register instructions길이가 짧은(format 2) 것도 있지만 더 중요한 것은 메모리 참조가 필요없기 때문에 register-to-memory operations보다 빠르다.

  그리고 immediate addressing을 사용할 때 operand는 이미 insturction의 일부이므로 다른 곳에서 가져올 필요가 없다.

  indirect addressing을 사용할 때는, Line:70의 "return"(SIC ver.에서는 LDL이후 RSUB하여 2개의 instruction 사용)처럼 다른 insturction이 필요하지 않은 경우가 많다.

Translation of Register-to-Register Instructions

  어셈블러는 단순하게 mnemonic operation code를 OPTAB을 이용하여 기계어로 변환하고 각 register mnemonic을 numeric equivalent(한글로 번역하기 애매...😥)로 변환해야한다. 레지스터 mnemonic을 숫자로 변경하는 것은 별도의 표로 수행할 수도 있지만 이러한 목적으로 SYMTAB를 사용하는 것이 편리하다.

fig 4. format 2 instruction

  • 이를 위해 SYMTAB에는 레지스터의 이름(A, X, ...)과 해당 값(0, 1, ...)이 사전에 로드된다.
    • A(0), X(1), L(2), B(3), S(4), T(5), F(6), PC(8), SW(9)
    • Ex) Line 150:  1049     COMPR A,S     A004

Translation of Register-to-memory Instructions

  메모리를 참조하는 format 3 instructions은 일반적으로 pc relative나 base relative addressing mode로 assemble된다. 어떤 경우든 assembler는 정확한 TA를 얻기 위해 displacement(변위)를 계산해야한다. 즉 object instruction의 일부로 조립되어야 한다.

  • TA = (PC) or (B) + displacement
  • displacement는 instruction의 12-bit field에 맞도록 충분히 작아야한다.
    • Base relative (disp: 0 ~ 4095)
    • PC relative (disp: -2048 ~ 2047)
  • 어셈블러는 다음을 사용하여 format 3 instruction을 변환하려고 시도한다.
    • 우선 PC relative부터 시도.
    • 그 다음에는 Base relative (필요 displacement가 범위를 벗어난 경우)
    • 에러메시지 생성 (relative modes가 모두 유효하지 않을 때)

Example of PC Relative Addressing

  우선 STL의 opcode값은 14이다. 그런데 최상위 2byte의 값이 17이므로 위의 'magic'을 사용하면 'n=i=1'임을 알 수 있다. 처음에는 pc relative를 사용한다. disp field값을 구하는 것은 위에서 설명했듯이 'TA - (PC) = 30 - 3 = 2D'이다. 이는 12-bit field에 충분히 표현할 수 있으므로 flag bit p는 1이 된다.

 

Translation of Format3(Base Relative Addressing) Instructions

  base relative addressing을 위한 displacement 계산 과정은 PC relative addressing과 거의 같다.

  • 어셈블러는 실행 시 PC의 값을 알고 있다.
  • 반면에 base register는 프로그래머가 관리한다. 때문에 프로그래머는 어셈블러가 displacement를 계산할 수 있도록, 프로그램 실행 중에 base register가 무엇을 포함할 것인지 어셈블러에게 알려야한다.
  • 해당 작업은 어셈블러 directive BASE로 수행된다.
    • Line:13의 'BASE  LENGTH'구문은 어셈블러에게 base register에 LENGTH의 주소가 포함됨을 알려준다. 이전의 명령어 (LDB  #LENGTH)는 프로그램 실행 중에 이 값을 레지스터에 로드한다.
  • directive 'NOBASE'를 사용하여 B register를 해제할 수 있다.

Example of Base Relative Addressing

fig 5

  우선 LDB에 LENGTH의 주소를 저장하고 BASE를 이용해 어셈블러에게 base register에 LENGTH의 주소가 포함됨을 알렸다. 이후 Loc:104E를 살펴보자.

Translation of Format 4 Instructions

fig 6

  relative addressing에 필요한 displacement가 너무 커서 3byte instruction으로 표현할 수 없는 경우, 4-byte extended instruction 형식을 사용해야 한다.

  4-byte instruction format은 20-bit 크기의 address field를 포함한다. 때문에 전체 메모리 주소 표현이 가능하다(SIC/XE의 사용가능한 최대 메모리 크기는 2^20 bytes). 때문에 이때는 displacement를 계산하는 것이 아니다.

  프로그래머는 접두사 "+"를 사용하여 확장된 format을 사용한다는 것을 표시해야한다. 만약 표시하지 않는다면 어셈블러는 해당 지침을 format 3로 인지하고 변환하려고 할 것이다.

Example of Format 4 Instruction Translation

fig 7

  예시를 살펴보자. opcode mnemonic에 "+"를 접두사로 붙여줬다. 때문에 그리고 JSUB의 opcode는 48인데 최상위 2-bit가 '4B'이므로 n=i=1이다. 그리고 extended format이므로 flag bit e=1이 된다. 이때는 relative addressing이 아니므로 나머지 flag bit x, b, p는 0이 된다. 나머지 20bit에는 REREC의 주소가 바로 들어가게 된다. 이를 machine code로 표현해주면 '4B101036'이 됨을 알 수 있다.

Translation of Immediate Addressing Instructions

  방금 전에는 operand로 주소값을 직접 사용했다. 즉 immediate addressing을 사용한 것이다. 이는 메모리 참조가 없으므로 더 간단하다. operands의 값을 직접 address field에 넣어줄수도 있다.

  • 어셈블러는 operand를 즉시 내부 표현으로 변환하여 instruction에 삽입한다.
    • Ex) Line 55:   0020     LDA   #3     010003, flag bits 중 i만 1이다. SIC ver.에서는 상수 3을 저장하는 공간을 따로 할당해주었음을 떠올려보자.
  • operand가 너무 커서 12-bit의 displacement field에 들어갈 수 없는 경우 20-bit extended instruction format이 호출된다. 만약 operand가 20-bits에 담기에도 너무 크다면 그때는 에러메세지를 출력한다.
    • Ex) Line 133:    103C     +LDT   #4096     75101000
  • operand가 symbol인 경우 해당 주소 값이 instruction에 삽입된다.
    • Ex) Line 12:      0003     LDB    #LENGTH     69202D, immediate addressing을 사용하고 address field의 값을 구할 때는 PC-rerative addressing을 사용했다.

 

Program Relocation

fig 8

  이제 프로그램 내부 코드에서 조금 더 시야를 넓혀보자. 멀티 프로그래밍에 대해 알아보자. 멀티 프로그래밍은 메모리 및 기타 리소스를 공유하면서 한 번에 두 개 이상의 프로그램을 실행하는 것이다. SIC/XE는 아니지만 fig 8처럼 메모리에 여러 프로그램이 동시에 올라와 있는 걸 확인할 수 있다. 프로그램이 올라올 공간이 있다면 어디든 메모리에 로드될 수 있다. 이때 겹치거나 공간이 낭비되지 않게끔 메모리를 사용해야한다.

  전까지 우리는 SIC/XE에서 어셈블리어가 기계어로 변환하는 과정을 살펴봤다. 그런데 그 프로그램에서의 Loc값은 프로그램 내부에서의 위치이지 메모리에 올라온 프로그램의 statement의 위치는 아니다. 그 전의 예시들을 보면 알겠지만 어셈블러는 프로그램이 메모리에 로드될 때, 메모리의 실제 위치를 알지 못한다. 즉 프로그램의 실제 시작 주소는 로드되기 전 까지 알 수 없다.

fig 9
fig 10

  relative-addressing과 같은 경우는 상관없겠지만, '+JSUB  RDREC'같은 구문에서 RDREC의 위치는 프로그램이 어디에 로드 되었냐에 따라 달라진다. 그래서 address field 값을 원래 값에 프로그램의 시작주소를 더해야한다. 이를 프로그램 재배치(Program Relocation)이라고 한다. 어셈블러가 이를 해 줄 수 없으면 누가 이 역할을 하게 되는 걸까? fig 10을 보면 알겠지만 바로 로더(Loader)가 이를 수행한다.

  어셈블러는 로더에게 object program(재배치 가능한)에서 수정이 필요한 부분에 대해 알려준다. 해당 동작이 어떻게 이루어지는지 살펴보자. 어셈블러는 로더가 일부 명령(instruction)의 주소 필드에 시작 주소를 추가하는 명령을 생성하여 object program에 추가한다(Modification record로). 이후 로더는 프로그램 시작과 관련된 주소를 생성하고 명령을 수정한다.

  때문에 object program에서는 Modification record가 추가된다. 해당 레코드의 구성을 알아보자.

  • Col. 1: M
  • Col. 2-7: 프로그램 시작에 비례하여 수정될 address fileld의 시작 위치(16진법)
    • 시작 위치는 수정할 주소 필드의 맨 왼쪽 비트를 포함하는 바이트의 위치
  • Col. 8-9: 수정할 주소 필드의 길이, half-bytes(16진법)

  당연히 모든 명령을 수정해야 하는 것은 아니다. operand가 메모리 주소가 아닌 경우(Ex. CREAR   S), operand가 PC 또는 base-relative addressing을 사용하여 지정된 경우(Ex. STL  RETADR)에는 수정할 필요가 없다.

  요약하면 로드 시 수정이 필요한 부분은 상대 주소가 아닌 직접 주소를 지정하는 부분뿐이다. 완전한 object code를 보면서 마치자.

fig 11

  'M00000705'에 해당하는'4B101036'만 살펴보자. 000007이이니 7번째 byte를 찾아보자. 그럼 '4B101036'의 '4B'부분이다. 물론 address field는 0부터 시작하지만 '수정할 주소 필드의 맨 왼쪽 비트를 포함하는 바이트의 위치'임을 기억하자. 그리고 'M00000705'에서 뒤의 '05'는 수정할 주소 필드의 길이를 half-bytes 단위로 나타낸 것이다. format-4에서 address field의 크기는 20bits(5*4bits)이므로 '05'가 들어가게 되는 것이다.


이미지 출처

 

 

 

'시스템 프로그래밍' 카테고리의 다른 글

Assemblers (4)  (0) 2021.10.15
Assemblers (3)  (0) 2021.10.15
Assemblers (1)  (0) 2021.09.28
SIC/XE (SIC/eXtra Equipment)  (0) 2021.09.12
SIC (Simplified Instructional Computer)  (0) 2021.09.09

댓글