[시스템프로그래밍] basic assembler functions / SIC

Jay·2024년 4월 12일

시스템프로그래밍

목록 보기
2/2
post-thumbnail

A Simple SIC Assembler

Assembler 실행 → object 파일 만들어짐 → memory에 올림 (loading) : 실행하기 위해 loading 하는 것

  1. Mnemonic code를 각 할당된 기계어로 변환하기

    → translate STL to 14

  2. symbolic operands를 기계어로 변환하기

    → translate RETADR to 1033

  3. Build the machine instructions in the propler format

  4. Convert the data constants in the source program into their internal machine representations

    → translate EOF to 454F46

  5. Write the object program : 실행하기 위해 작성하는 것


🔍 MORE

  • Forward reference 는 현재 명령어보다 더 앞쪽의 명령어이므로 바로 알 수 없으므로 2 pass assembler 를 이용
    • 2 pass assembler
      • First pass : source program의 label을 scan해서 symbol table 만듦
      • Second pass : Symbol table을 이용해서 정규 명령어가 아닌 명령어들 처리하기 (ex. RETADR)

Assembler directives : 어셈블리 지시어

  • 기계어로 번역되지 않음 (명령어가 아니기 때문에)
  • 그저 assembler에게 특정 메세지를 전달하는 역할만 함
    • START

    • END

    • BYTE ( SIC에서는 모든 게 다 3byte)

    • WORD : generates one-word (3byte) integer constant

      // Ex)
      THREE    WORD     3
      //THREE 라는 번지에 '3'이라는 상수를 WORD단위로 집어넣는다
      //BYTE와 WORD명령은 상수를 생성하는 것
    • RESB : 주어진 상수 양 만큼의 BYTE 할당을 예약

    • RESW : 주어진 상수 양 만큼의 WORD 할당을 예약

      // Ex)
      ALPHA    RESW     30
      //ALPHA 번지에 word 단위의 공간 30개를 예약한다는 것
      //값을 제외한 공간만 생성함

Object Program Format

실행하기 위해서는 Object Program가 만들어져야 함

  • Header
    • H (program name) (시작주소) (program 총 바이트 길이)
  • Text
    • T (시작하는 location count값) (읽을 바이트 길이) (구한 object code)
  • End
    • E (program의 마지막 주소)

Two passes assembler

어셈블리어로 작성된 코드를 2번 순회하면서 첫 번째 순회때 부족한 부분을 채워준다는 의의가 있음

⌨️ Ex)

       JEQ ENDFIL
ENDFIL LDA  EOF   

첫 번째 순회 때는 ‘JEQ ENDFIL’에서 ENDFIL이 뭔지 모르는데 ENDFIL을 어딘가에 저장해 두고 2번째 순회를 하면 또 나왔을 때 알 수 있을 것

  • Pass 1 ⇒ Symbol table 만들어짐
정의해야하는 symbollocation count
ENDFIL1015
EOF102A

첫 번째 Pass 단계에서는 찾으려는 값이 어디에 위치해있는지 저장이 되며 Symbol table이 만들어질 것이다 (실제 위치만 저장되있고 명령어 코드는 완성되지 않았을 것)

업로드중..

  • Pass 2 ⇒ Symbol table을 이용해 정규 명령어가 아닌 명령어들을 처리하는 과정
8084 : adr r1, **msg** -> 8084 : adr r, **pc#(msg-808c)**
//808c를 빼주는 이유는 PC를 빼줘야 해서임

/*
adr이란 것을 실제 정의되있는 명령어가 아니라, 
실제로 어셈블러를 만들고자 하면 우리가 직접 만들어야 함
*/

msg 주소 값은 상대주소로 가져와야 하기 때문에 현재 PC와 msg 절대 주소 값의 차이를 PC에 더해줘야 함

(현재는 8084가 맞지만 pc는 다음에 실행할 명령어인 808c이다)


실행되는 순서

  1. Location Counter (LOCCTR) 작성
  2. Symbol Table (SYMTAB) 작성 ⇒ pass1
  3. Intermediate file
  4. pass 2
  5. object program ⇒ execute(실행)
profile
Live a life you will remember !

0개의 댓글