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

프로그램 리로케이션과 어셈블러의 역할: SIC/XE 어셈블리 프로그램 예제

by 큌 2024. 4. 21.
반응형

2024.04.20 - [Computer Science/시스템 프로그래밍] - SIC/XE Assembly Program with Object Code

 

SIC/XE Assembly Program with Object Code

2024.04.19 - [Computer Science/시스템 프로그래밍] - 어셈블러의 작동과정 및 오브젝트 코드 생성 과정, 어셈블러 동작 메커니즘 어셈블러의 작동과정 및 오브젝트 코드 생성 과정, 어셈블러 동작 메커

perfect-occasion.co.kr

Another Example of Program-Counter Relative Addressing

  • Line 40 in Fig. 2.6


PC 상대주소 예제

이전 예제와 방식 동일

disp 데이터가 음수인 경우 2의 보수 표현법 사용

이를 통해 오브젝트 코드 생성


Translation of Format 3 (Base Relative Addressing) Instructions

  • 기본 상대 주소 지정의 displacement 계산 프로세스는 PC relative addressing의 경우와 거의 동일
    • 어셈블러는 실행 시 프로그램 카운터의 내용이 무엇인지 알고 있음
    • 반면에 base 레지스터는 프로그래머의 제어 하에 있음, 따라서 프로그래머는 어셈블러가 displacement를 계산할 수 있도록 프로그램 실행 중에 Base 레지스터에 포함될 내용을 어셈블러에 알려야 함
    • 이것은 어셈블러 BASE directive로 수행
      • 예) BASE LENGTH(13행) 문은 기본 레지스터에 LENGTH의 주소가 포함될 것임을 어셈블러에 알림, 이전 명령어(LDB #LENGTH)는 프로그램 실행 중에 이 값을 레지스터에 로드
    • NOBASE 지시문을 사용하여 B 레지스터를 free 가능

Base relative addressing

Base 레지스터를 이용해 disp 값을 구함

PC relative addressing는 PC 레지스터의 값을 어셈블러가 예측이 가능함, 항상 PC는 다음명령의 주소값을 갖고 있기 때문에

Base 레지스터는 프로그래머가 제어, 프로그래머가 어셈블러에게 알려주어야함

사용을 위해서는 Base 지시문을 먼저 사용해야함

NOBASE 지시를 통해 초기화 가능


Example of Base Relative Addressing

  • Line 160 in Fig. 2.6


어셈블러는 PC relative addressing을 먼저 사용, 그 이후에 Base relative addressing 사용

우리가 어셈블러가 되었다는 것을 가정해서 PC relative addressing 먼저 사용

그러나 disp 값을 2의 보수를 적용해도 12비트 주소 필드로 표현 불가능

그렇기 때문에 이를 멈추고 Base relative addressing을 사용

BASE는 쉽게 계산, disp = 3

인덱스 주소 지정과 베이스 주소 지정을 사용하기 때문에 xb 비트를 플래그, xbpe = 1100 = 3


Translation of Format 4 Instructions

  • PC relative addressing 또는 Base relative addressing을 모두 사용할 수 없는 경우(두 상대 주소 지정 모드에 필요한 displacement가 너무 커서 3바이트 명령어에 맞지 않기 때문에) 4바이트 확장 명령어 형식을 사용해야 함
    • 이 4바이트 형식에는 전체 메모리 주소를 포함할 수 있을 만큼 충분히 큰 20비트 주소 필드가 포함
    • 이 경우 displacement를 계산할 필요 없음
    • 프로그래머는 접두사 "+"를 사용하여 확장 형식을 지정해야 함, 프로그래머가 지정하지 않으면 어떻게 되는가? ... 어셈블러는 다음을 사용하여 명령을 format 3로 변환하려고 시도
      • PC relative addressing, first;
      • Base relative addressing(필요한 변위가 범위를 벗어난 경우)
      • 오류 메시지 생성(양쪽 상대 모드에서 변위가 유효하지 않은 경우)

PC relative addressing, Base relative addressing 둘다 안된다면 어셈블러는 에러 메세지 사용

그럼 프로그래머는 이를 해결하기 위해 format 4 사용

format 4는 20비트 주소 필드라 어떤 메모리든 접근 가능

format 4는 다이렉트 주소 지정이라 disp 계산 필요 없음

prefix ‘+’를 붙이면 format 4


Example of Format 4 Instruction Translation

  • Line 15 (the extended format) in Fig. 2.6


매우 간단한 변환


Translation of Immediate Addressing Instructions

  • immediate addressing을 지정하는 명령어 어셈블리는 메모리 참조가 관련되지 않기 때문에 더 간단
    • 어셈블러는 immediate 피연산자를 내부 표현으로 변환하여 명령어에 삽입
      • 예) 55행: 0020 LDA #3 010003
    • 피연산자가 너무 커서 12비트 변위 필드에 맞지 않는 경우 20비트 확장 명령어 형식이 호출
      • 예) 133번 행: 103C +LDT #4096 75101000
      • 20비트 주소 필드에도 피연산자가 너무 크면?
    • 피연산자가 기호인 경우 해당 주소 값이 명령어에 삽입
      • 필요한 경우 displacement 계산을 수행합니다.
      • 예) 12행 : 0003 LDB #LENGTH 69202D
      • → Immediate addressing + PC-relative addressing

Immediate 주소 지정은 매우 간단함

상수가 들어간다면 그냥 주소 필드에 넣어주기만 하면 됨

3을 16진수로만 바꾸어서 넣어주기

LDA + 1을 해서 첫 2개의 16진수 필드 값을 계산할 수 있음: magic 룰 기반, 위에 보기

12비트 필드로 표현 불가능한 경우가 있음, 이때 포멧 4 사용하여 상수 표현

SIC에서 정수값은 3바이트, 그렇기 때문에 20비트로 표현 불가능한 값을 처리하는 경우가 있음

이때 메모리 공간을 사용하여 처리 WORD를 통해 정수 상수를 선언하던가, RESW로 1 WORD 공간을 만들어서 사용

이를 상대 주소나 직접 주소 지정으로 접근

연산자가 심볼이면 그 심볼의 주소를 피연산자로 사용, LENGTH의 주소값을 사용

이때 주소값 계산을 위해 disp 값을 구하기, PC 상대 주소 → BASE 상대 주소 사용


Program Relocation (1/4)

  • 멀티 프로그래밍
    • 메모리와 다른 자원을 공유하면서 동시에 하나 이상의 프로그램을 실행
    • 중복되거나 공간 낭비 없이 메모리를 사용하는 것이 중요
    • 프로그램을 위한 공간이 있는 메모리에 프로그램 로드
  • 어셈블러는 프로그램이 로드될 메모리의 실제 위치를 알지 못함
    • 프로그램의 실제 시작 주소는 로드 시간까지 알 수 없음

프로그램 리로케이션이라는 다른 주제

옛날 컴퓨터 머신은 한번의 한번의 프로그램 실행

시작 지시문을 통해 시작 주소를 지정

그러나 요즘은 대부분의 컴퓨터 머신에서 멀티 프로그램 지원

이런 상황에서 꼭 자기가 정한 시작 주소에서 시작하지 않음

시작 주소가 0이라도 거기에 다른 프로그램이 로드되어 있으면, 운영체제가 다른 빈공간을 찾아 로드

프로그램의 시작 주소가 설정한 주소와 달라질 수 있음

각 프로그램의 시작 주소는 메모리에 로드하는 로더에 의하여 결정

어셈블러는 실제로 시작하는 시작 주소를 알 수 없음


Fig. 2.7: Examples of Program Relocation


같은 프로그램을 여러번 실행시키더라도 메모리에 상태에 따라 시작 주소가 달라짐

예제 프로그램을 3번 실행

첫번째 실행 시작에는 운이 좋게도 0번 시작 주소에 로드, 시작 주소가 0으로 셋팅 되어 있어 자기가 설정한 주소로 로드

여러 명령어 역시 시작 주소가 0이라는 가정을 하고 변환

JSUB은 1036이라는 RDREC의 주소 값을 가지고, 실행시킬때 1036으로 점프하여 RDREC 실행

그러나 만약 그 메모리 공간이 비어있지 않다면 운영체제가 다른 공간을 찾아서 실행

RDREC은 1036이라는 주소값을 가지고 있는데 만약 다른 공간 5000이 시작 주소가 되면 점프할때 1036으로 이동

그러나 보안상 다른 프로그램이 사용중인 메모리 주소 영역으로 이동 불가

이러한 상태에서 운영체제는 프로그램을 kill 함

그래서 이러한 명령을 수정 필요

올바른 상황에서 RDREC의 1036을 6036으로 로더가 바꿔줘야함

어셈블러는 이것이 어디에 로더될지 모르기 때문에 할 수 없고, 로더가 하는 작업임

로더가 로딩되는 시작 주소를 기존 주소 필드 1036에 더해주어서 변경 1036 + 5000 = 6036

만약 7420이 시작 주소하면 1036 + 7420 = 8456

이는 멀티 프로그램에서 발생할 수 있는 오류 케이스 이고 이를 간단하게 해결하는 예제

그럼 이것을 어떻게 수정할 것인가? 이 정보는 일단 어셈블러가 알고 있음


Program Relocation (2/4)

  • 어셈블러는 개체 프로그램에서 수정이 필요한 부분을 로더에게 알림(→ relocatable 재배치 가능한 object program)
    • 그림 2.7 참조

  • Solution for relocation problem 재배치 문제 해결
    • 어셈블러는 로더가 일부 명령어의 주소 필드에 시작 주소를 추가하는 명령을 생성 → 이 명령은 목적 프로그램(Modification record 포함)의 일부가 됨
    • 로더는 프로그램 시작과 관련된 주소를 생성하고 명령어를 수정

어셈블러가 결국 로더에게 어떤 명령어를 수정해야할지 알려줌, 이는 리로케이션 정보

이 리로케이션 정보를 가지고 수정된 프로그램이 리로케이션 오브젝트 프로그램


Program Relocation (3/4)

  • Modification records 수정 기록
    • "M", 시작 위치, 수정할 주소 필드의 길이
      • Col. 1 M
      • Col. 2-7 프로그램 시작을 기준으로 수정할 주소 필드의 시작 위치(Hex)
      • → 시작 위치는 수정할 주소 필드의 가장 왼쪽 비트를 포함하는 바이트의 위치입니다.
      • Col. 8-9 수정할 주소 필드의 길이, half-bytes(Hex)
  • No modification 수정 없음
    • 명령 피연산자가 'CLEAR S' 문과 같이 메모리 주소가 아닌 경우
    • 또는 'STL RETADR' 문과 같이 PC relative addressing 또는 base relative addressing을 사용하여 피연산자를 지정하는 경우

어떤 주소 필드를 수정해야하는지 위치와 길이를 알려줌

길이 정보가 half-bytes로 표현

수정해야하는 필드에 대해 어셈블러가 만들어줌


Program Relocation (4/4)

  • 요약하면 로드 시 수정이 필요한 프로그램 부분은 direct addresses(relative addressing가 아님)를 지정하는 부분 뿐임
    • SIC/XE 프로그램의 경우 직접 주소는 Format 4 명령어에 있음
  • 그림 2.8은 완전한 목적 프로그램을 보여줌

메모리 레퍼런스가 없는 명령어, 상대주소를 사용하는 포멧 3 명령어는 신경 쓸 필요가 없음, base 주소에 따른 disp를 사용하기 때문에 필요 없음, 상대적인 주소 차이는 항상 유지

다이렉트 어드레싱을 사용하는 명령을 신경 써야함, 특히 포멧 4

다이렉트 어드레싱을 사용하는 명령은 실제 주소를 사용하기 때문에 핸들링을 해주어야함

SIC는 다이렉트 어드레싱을 사용하는 경우가 매우 많음, 인덱스트 빼고 다 Modification records 만들어야함


Fig. 2.8: Object Program (corresponding to Fig. 2.6)


3개의 포멧4 명령어를 가지고 있음

어셈블러는 위치만 알려주고 이를 처리하는 것은 로더

반응형