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

SIC/XE Assembly Program with Object Code

by 큌 2024. 4. 20.
반응형

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

 

어셈블러의 작동과정 및 오브젝트 코드 생성 과정, 어셈블러 동작 메커니즘

2024.03.03 - [Computer Science/시스템 프로그래밍] - SIC/XE 아키텍처: 기본 구조에서 명령어 집합까지 (2) SIC/XE 아키텍처: 기본 구조에서 명령어 집합까지 (2) Translating and Starting a Program 컴퓨터의 초창기에

perfect-occasion.co.kr

Machine-dependent Assembler Features

  • 어셈블러는 명령 형식과 주소 지정 모드에 따라 다름
  • 그림 2.6은 SIC/XE 명령어 세트를 활용하기 위해 재작성될 수 있는 object code와 함께 그림 2.1의 예제 프로그램을 보여줌
    • Indirect addressing은 피연산자에 접두사 "@"를 추가하여 표시
      • 예) J @RETADR
    • Immediate operands는 접두사 "#"으로 표시됩니다.
      • 예) COMP #0
    • Format 4 instruction은 (= 4바이트 확장 형식)은 연산 코드에 접두사 "+"가 추가되어 지정
      • 예) +JSUB RDREC
    • 어셈블러 지시문 "BASE"는 기본 상대 주소 지정과 함께 사용
      • 예) BASE LENGTH

→ 필요할 때 이러한 형태의 주소 지정을 지정하는 것은 프로그래머의 책임


간접 주소 지정은 @ 기호를 사용

이러한 심볼이 없으면, 단순히 리턴 주소가 가르키는 주소로 점프하고 끝남

직접 주소 지정을 하면 리턴 주소가 가르키는 메모리로 가서 그 주소로 다시 점프함 = 포인터와 유사

피연산자 사용은 # 기호를 사용

포멧4를 사용할떈 + 기호 사용, 전체 주소 영역을 가르킬 수 있음

Base 상대 주소 지정을 사용하기 위해서 BASE 지시문 사용

Base 사용을 통해 레지스터 B에 어떤 주소가 저장되어있는지 어셈블러에게 알려줌

BASE LANGTH 값을 어셈블러에게 알려줌

PC 주소는 어셈블러가 알아서 해줌

그리고 이러한 주소 지정 모드 및 명령어 포맷의 고려는 프로그래머의 일임


[Fig. 2.6] SIC/XE Assembly Program with Object Code


LDB, BASE 2라인을 통해 베이스 관계 주소 지정 모드를 사용

LENGTH 값 자체를 값으로 사용 → 예의 할당된 주소 값 자체가 레지스터 B로 올라감, 그리고 레지스터 B에 이 값이 올라가 있다는 것을 레지스터에 알려줌

JSUB은 포멧 4를 사용, RDREC의 주소인 1036을 표현하기 위해서는 최소 13비트가 필요, 그러나 포멧 3는 12비트이기 때문에 이 주소를 사용할 수 없음, 그래서 포멧 4를 사용하여 20비트의 주소 필드로 사용

RDREC 서브 루틴, 이전에 배웠던 프로그램과 로직 동일

X, A, S 초기화 후 LDT에 상수 4096을 저장, 이때 포멧 4로 저장하는데 4096은 hex1000이기 때문에 최소 13비트 필요, 그렇기 때문에 20비트 표현 가능한 포멧 4 사용

인풋 디바이스가 준비되었는지 RD, JEQ로 테스트

COMPR 명령어로 A와 S비교, A와 S가 같다는 것은 입력 값이 0이라는 의미, 이는 EOF

TIXR로 X를 1 증가시키고 X가 T보다 작다면 아직 읽을 데이터가 남아있기 때문에 루프로 돌아감, X가 T보다 크다면 프로그램 종료

WRREC 서브 루틴, 이전에 배웠던 프로그램과 로직 동일

WRREC 호출 후, CLOOP으로 무조건 점프, 이러한 코드를 계속 반복하며 인풋 디바이스로 데이터를 읽고 아웃풋 디바이스로 데이터를 쓰는 것을 반복

언젠가 파일의 끝을 만날 것이고 JEQ 명령어를 통해 종료 명령어 실행, EOF 문자를 버퍼에 복사하고, EOF 길이를 LENGTH에 복사

이후 이러한 정보를 WRREC를 통해 아웃풋 디바이스에 쓰기

기존 코드에서는 리턴 주소를 레지스터 L에 저장 후 다시 가져와 종료, 그러나 여기서는 하나의 명령만으로 동작 실행 RETADR은 리턴 주소를 가지고 있음

J @RETADR을 통해 RETADR 메모리에 저장된 주소값을 찾고 그 주소값으로 점프하여 종료

이전 버전과 비교하며 코드리뷰하기


The Magic


obj코드로 바꿀때 16진수 수 사용

중간에 있는 4비트의 16진수 수는 어떤 어드레싱 모드인지 정할 수 있음

앞의 2개 비트는 opcode + 1 ~ 3으로 정할 수 있음

공식처럼 생각해서 계산할 수 있음, 꼭 기억해두자


What does SIC/XE Assembler Do?

  • 그림 2.1과 그림 2.6 버전의 두 가지 주요 차이점
    • 가능하면 register-to-register instructions 사용
      • 예) COMP ZERO (그림 2.1) → COMPR A,S (그림 2.6)
    • 가능한 한 immediate & indirect addressing 사용
  • 이러한 변경 사항은 보다 발전된 SIC/XE 아키텍처를 활용하여 프로그램의 실행 속도를 향상시킴
    • Register-to-register instructions은 해당 register-to-memory operations 보다 더 빠르며, 더 빠른 이유는 다른 메모리 참조가 필요하지 않기 때문
    • immediate addressing을 사용할 때 피연산자는 이미 명령어의 일부로 존재하며 어디에서나 가져올 필요가 없음
    • indirect addressing을 사용할 때 다른 명령이 필요하지 않은 경우가 많음(70행의 “return” 연산에서와 같이)

SIC/XE 기능을 사용하면 어떤 점이 좋은가?

포멧 4 명령 사용:

레지스터-레지스터 명령어: COMP → COMPR 명령어로 대체, 메모리보다 레지스터 접근 속도가 빠르기 때문에 이는 더욱 빠름, 이러한 명령을 쓰면 프로그램을 빠르게 만들 수 있음, 포멧2 명령어가 조금 더 빠르다, 메모리 엑세스를 요구 하냐 안하냐 차이

직접 주소 지정 모드: 피연산자 값을 명령어에 직접 넣을 수 있음, 즉 메모리에 접근할 필요가 없기 때문에 프로그램의 속도를 빠르게 만들 수 있음

간접 주소 지정 모드: 명령어 2개를 1개로 전환가능, 추가적인 명령어 사용을 피할 수 있다는 장점 존재


Translation of Register-to-Register Instructions

  • 어셈블러는 니모닉 연산 코드를 기계어로 변환하고(OPTAB 사용) 각 레지스터 니모닉을 해당하는 숫자로 변경해야 함
    • 이러한 레지스터 니모닉을 숫자로 변경하는 것은 별도의 테이블에서 수행할 수 있음, 그러나 이러한 목적으로 SYMTAB을 사용하는 것이 편리한 경우가 많음
    • 이를 위해 SYMTAB에는 레지스터 이름(A, X 등)과 해당 값(0, 1 등)이 미리 로드
      • A(0), X(1), L(2), B(3), S(4), T(5), F(6), PC(8), SW(9)
    • 예) 150번 라인: 1049 COMPR A,S → A004

포멧 2는 매우 간단히 번역 가능


Translation of Register-to-Memory Instructions

  • Format 3 메모리를 참조하는 명령어는 일반적으로 program-counter relative 또는 base relative addressing mode를 사용하여 조합
    • 두 경우 모두 어셈블러는 올바른 대상 주소를 얻기 위해 displacement 변위를 계산해야 함(즉, 개체 명령의 일부로 어셈블)
    • arget Address = (PC) or (B) + displacemen
    • 결과 displacement 변위는 명령어의 12비트 필드에 맞도록 충분히 작아야 함
      • Base relative (disp: 0 to 4095)
      • Program-counter relative (disp: -2048 to +2047)
    • 어셈블러는 다음을 사용하여 형식 3 명령을 번역하려고 시도
      • PC relative, first;
      • Base relative (필요한 변위가 범위를 벗어난 경우)
      • 오류 메시지 생성(양쪽 상대 모드에서 변위가 유효하지 않은 경우)

포멧 3는 상대 주소 지정 모드에 사용, 상대 주소 지정을 위한 displacement 값을 구해야함, displacement 값은 PC나 Base에 더할 값, 그렇기 때문에 어셈블러에게 중요한 것은 displacement 값, 목표 주소가 목표가 아님

displacement = Target Address - PC or BASE, 그리고 이 값은 꼭 12비트 필드에 들어가야함, 이러한 값은 PC나 BASE에 따라 다르고, 이에 따라 타겟팅 하는 주소 범위가 다름

어셈블러는 PC 관계 모드를 첫번째로 시도, displacement 값이 가능한 범위에서 너무 작거나 크다면, Base 관계 모드로 두번째 시도, 그래도 안되면 에러


Example of PC Relative Addressing

  • Line 10 in Fig. 2.6 (PC relative addressing mode)

Another Example of Program-Counter Relative Addressing

반응형