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

jungizz_·2025년 4월 25일

System Programming

목록 보기
2/8
post-thumbnail

🔸Translating and Starting a Program

  • 초기에는 프로그래머가 기계어(이진 코드)로 직접 개발
  • 현대에는 사람이 이해하기 쉬운 언어를 사용하기 때문에 기계어로 번역해야 함

🔹Translation Hierarchy

  1. Complier: high-level language(C Program)를 low-level language(Assembly)로 변환
  2. Assembler: Assembly를 기계어로 변환하여 오브젝트 생성
    • Assembly language: 기계어와 1:1대응되는 low-level 언어
  3. Linker: 여러 개의 오브젝트 파일을 하나의 실행 파일로 결합하여 기계어 프로그램을 만듦
  4. Loader: 실행 파일을 메모리에 올려 실행할 준비

🔹Assembler

  • Assembly언어로 작성된 프로그램을 기계어로 변환하는 시스템 소프트웨어
  • 최종적으로 오브젝트 파일을 생성하고, 기계어 instructions, data, 명령어를 메모리 내에 적절히 배치하는데 필요한 정보를 포함
  • 주요 기능
    • opcode table을 사용하여 Mnemonic operation code를 기계어로 변환
    • symbol table을 사용하여 각 레이블의 이름과 그 레이블이 차지하는 메모리 주소를 매칭
  • 기본적인 기능을 고려하면 대부분 유사하지만, machine architecture에 따라 기능과 설계가 달라짐 → Machine Dependent Feature

🔸SIC Assembler Lauguage Program

🔹Components

  • line number (참조용, 프로그램의 일부가 아님)
  • symbol label
  • Mnemonic instruction
  • Indexed addressing
  • comments

🔹Assembler Directive (지시어)

Directive는 기계어로 변하지 않고, assembler에 대한 instrictons을 제공 → assembler는 이러한 지시어를 통해 동작

  • START: 프로그램의 이름과 시작 주소 명시
  • END: 원시 프로그램(source program)의 끝을 나타냄, (선택적으로) 최초로 실행할 명령어 지시
  • BYTE: 문자나 16진수 상수 생성, 상수를 표현하는데 필요한 만큼의 바이트 사용
  • WORD: 1워드의 integer 상수 생성
  • RESUB: 데이터 영역의 크기를 지시된 바이트 수 만큼 예약(reserve bytes)
  • RESW: 데이터 영역의 크기를 지시된 워드 수만큼 예약(reserve words)

🔹I/O처리 방식

  • assembler language program은 입력 장치F1로부터 레코드를 읽고 출력 장치 05로 복사하는 메인 루틴을 가짐
  • 메인 루틴은 두 개의 subroutine을 호출함
    • RDREC: 입력 장치로부터 레코드를 읽어 버퍼 4096bytes에 저장
    • WRREC: 버퍼에 저장된 레코드를 출력 장치로 기록
  • 각 subroutine은 레코드를 한 번에 한 문자씩만 전송 (SIC에서 제공하는 I/O 명령어가 RD, WD뿐이라서)
    • 레코드는 여러 문자를 포함하고, 끝은 Null문자(hex 00)으로 표시됨
  • 입력 및 출력 장치 간의 I/O 속도 차이로 인해 버퍼가 필요

🔹EOF 처리, Subroutine

  • 파일의 끝(EOF) = 서브루틴의 끝
  • 프로그램은 파일의 끝이 감지되면 EOF를 출력하고, RSUB명령어로 파일 종료 시킴
  • JSUB: 파일(서브루틴) 호출
    • JSUB m: 현재 PC의 값을 레지스터L에 저장, PC를 subroutine 시작 주소 m으로 설정 L ⇐ (PC); PC ⇐ m
  • RSUB: OS로 제어 반환 (프로그램의 흐름을 이전 상태로 되돌림)
    • RSUB: 레지스터 L에 저장된 주소를 PC에 복원 PC ⇐ (L)

Example of Assembly program

  • 키보드로 입력 받은 값을 버퍼로 옮겨서 그대로 출력하는 예제

🔹Object Code

  • 각 instruction에 대한 Object code와 machine address가 존재
  • Machine address
    • 위의 예시에서 주소를 나타내는 ‘LOC’ 열이 빠져있음 (COPY프로그램은 주소 1000에서 시작)
    • ‘LOC’ 열은 machine address(in hex)를 제공
    • instruction 한 줄은 word3byte단위라서 3씩 증가 (1000 > 1003 > 1006 > …)
  • 소스 프로그램을 Object code로 변환하기 위한 여러 functions
    1. OP code table을 이용해서 mnemonic operation codes STL 를 machine language equivalents 14 변환 → opcode
    2. Symbol table을 이용해서 Symbolic operands(피연산자) RETADDR 를 equivalent machine addresses 1033 변환 → X + address
    3. Machine instruction 빌드 (addressing mode 등과 같은 적절한 형식으로)
    4. data constants EOF를 내부 machine representation 454F46으로 변환
    5. object program과 assembly listing file 작성
      • assembly listing file: 프로그램이 어떻게 변환되었는지를 검토하는데 사용
    위 기능들은 소스 프로그램을 한 번에 한 줄씩 순차적으로 처리하기 때문에 쉽게 수행할 수 있음. but, 주소를 번역하는 2번 function에서 forward reference 문제가 발생할 수 있다

  • Forward reference
    • 위 예시의 Line 10에 forward reference가 포함되어있음
    • 이것 때문에 대부분의 어셈블러는 2pass로 구현
      • 1pass: Label 정의 스캔 및 symbol table에 label의 주소를 기록
      • 2pass: 위의 Object code로의 변환 과정 수행

Example of Object code


🔹Object Program

  • 어셈블러는 생성된 object code를 출력 장치(storage)에 저장된 object program에 기록
  • 저장된 object program이 memory에 로드되며 실행됨

Object program 형식의 3가지 type record

  • Header record: 프로그램 이름, 시작 주소 및 길이
    • Col. 1: H 1byte
    • Col. 2-7: Program name 6byte(아래도 같은 형식으로)
    • Col. 8-13: object program의 시작주소(16진수)
    • Col. 14-19: bytes로 표현한 object program의 길이(16진수)
  • Text records: 변환된 instruction과 data와 이것들이 로드될 주소
    • Col. 1: T
    • Col. 2-7: 해당 레코드의 object code 시작주소(16진수)
    • Col. 8-9: bytes로 표현한 해당 레코드의 object code 길이(16진수)
    • Col. 10-69: 16진수로 표현된 object code(column 2개가 1 byte)
  • End records: 프로그램의 끝, 시작될 떄 주소
    • Col. 1: E
    • Col. 2-7: object program에서 첫 번째 실행 가능한 주소(16진수)

Example of Object Program

  • object code를 나열
  • 위의 3 types of record와 함께 보기
  • Loc 1033-2038에는 해당하는 object code가 없음
    • 메모리 공간만 할당만 해두는 ‘RESW', 'RESB'는 프로그램이 동작하면서 결정되므로 assembler가 해당 object code를 정의해둘 수 없는 것
    • 이 영역은 Loader에 의해 프로그램 실행 중에 사용할 수 있도록 예약만 된 저장공간

🔹Object File (UNIX)

  • Unix시스템용 object file은 6개의 영역으로 나뉨
    • Header: object file의 나머지 5개 영역의 크기 및 위치
    • Text segment: machine language code
    • Static Data Segment: 프로그램이 살아있는 동안 할당되는 데이터
      • Unix에서는 정적/동적 데이터 전부 사용 가능
    • Relocation Information: program이 메모리에 로드될 때 절대 주소에 따라 달라지는 instructions 및 data words 식별
    • Symbol Table: functions 및 전역 변수에 대한 [lable-address] 정보
    • Debugging Information: machine instruction을 C소스파일과 연결할 수 있도록 symbolic 정보 포함

🔹2-pass Assembler

assembly code에서 object code로 변환하는 과정을 2pass로 진행

  • Pass1: Define Symbols (아래 정보를 담은 intermediate file 생성)
    • assembly code의 statement 읽기
    • LOCCTR(location counter)을 사용해서 N(byte addressing)으로 3byte씩 주소를 증가시키며 해당 statement에 주소 할당
    • 모든 label에 할당된 주소 값을 Symbol table에 저장 (Subroutine, function)
      • lable 중복 선언 확인 > 중복 아니면 location counter 계산 > mnemonic code 오타 확인 > symbol table 생성
    • 상수 선언, 공간 예약같은 assembler directives 처리 수행 (’RESW', 'RESB’ 등)
  • Pass2: Assemble instructions & generate object program
    • intermediate file을 입력으로 code 한 줄 읽기
    • table을 이용해서 opeartion code을 기계어 opcode로, label을 기계주소로 변환
    • pass1에서 끝내지 못한 assembler directives 처리
    • object program생성

🔹Data Structures

Operational Code Table (OPTAB)

ADD, STL, COMP 등으로 표현된 opcode를 assembler가 읽고 어떠한 기능의 opcode인지, 기계어로 무엇인지 인식하기 위해 필요한 정보를 모아둠

  • mnemonic opcode와 이에 해당하는 machine language
    • 만약 더 복잡한 assembler라면 가변 크기나 형식을 가지는 instruction을 포함할 수 있음
  • pass1에서는 mnemonic code를 조회하고 검증하는데, pass2에서는 opcode를 기계어로 변환하는데 사용
  • 보통 hash table로 구성 (Key: mnemonic code)
    • 최소한의 탐색으로 빠르게 탐색
    • OPTAB는 준비가 되면 이후에 수정되지 않음

Symbol Table (SYMTAB)

‘FIRST STL RETADR’을 읽고 RETADR이 1033에 위치하는 것, 기계어로 변환할 때 address filed에 1033을 넣어야하는 것을 인식하기 위해 각 label과 operands symbol에 대한 정보를 모아둠

  • 각 lable에 대한 이름, 값(주소), flag(오류 조건)
    • 종류, 길이 정보 포함 가능
  • pass1에서는 lables가 주소와 함께 symbol table에 입력되고, pass2에서는 피연산자 symbols을 table에서 찾아 assembled instruction에 넣을 주소를 얻음
  • hash table
profile
( •̀ .̫ •́ )✧

0개의 댓글