[System Programming : Build Program] 2. Assembler

이번 챕터에서는 assembly가 기계어로 바꾸는 방식을 상당히 자세히 다뤄볼 것이다. 이는 후에 내가 언젠간 배워야지 생각하는 보안의 reverse engineering과도 밀접히 연관되어 있을 것 같다. 다음학기에 공부해서 정리해야지.
  1. Terminology 는 늘 암기하자!
      • mnemonic : opcode의 assembly단에서 symbolic name이며, instruction임
      • assembler directives : machine code로 바뀌진 않으며, assembler에게 지시하는 지시자. 즉 어셈블러가 machine code로 변환하는 과정에서 알아야 하는 정보들 (#define같은 전처리기 macro랑 아예 다른 개념이니 주의!)
        • START / END : 프로그램 시작 / 끝을 알리는 directive 
        • BYTE , WORD (상수)
        • RESW, RESB (변수)
        • BASE -> 어셈블러가 Base기준의 displacement를 계산하기 위해선 base register 값을 알아야만 한다. 이는 사용자가 반드시 assembler에게 지시해줘야함.
          Fig1. SIC-XE assembly code / object code
    • Fig1는 SCI-XE의 assembly 코드를 의미한다. 보면 어셈블리언어 파트에 LABEL, INSTRUCTION, OPERAND가 존재한다. 어셈블러는 각 라인별로 기계어로 바꿔주는데, 2pass로 바꿔준다. pass1의 output은 intermediate file로, pass2의 input으로 들어간다. (마치 파이프라인. pass1 | pass2)
      • SYMTAB(symbol table)
        • label과 address를 맵핑해주는 테이블. pass2에서 address계산할때 사용된다.
        • label은 data label, instruction label이 있다. 
        • pass1에서 SYMTAB에 등록하며,
        • pass2에서 displacement계산을 위해 사용된다.
        • hash table!
      • OPTAB(opcode table)
        • opcode와 assembly mnemonic을 맵핑해주는 테이블
        • pass1에서는 assembly mnemonic의 타당성 검증 및 location counter계산을 위해 사용되고,
        • pass2에서는 실제 opcode 변환을 위해 사용
        • hash table이자 static table이다.(속도 !)
      • LOCCTR(Location Counter)
        • address 할당을 위한 카운터
        • pass1서 START directive에서 초기화되며, 매 instruction마다 새로 계산하여 업데이트
      • pass 1 (Fig2)
        • 각 line별 address를 계산하여 location counter에 등록
        • 각 LABEL과 주소값을 맵핑하는 Symbol table 등록
          • label은 함수명, 변수명, jump 위치 등이 있다. 
        • Direcitve 수행 (BYTE, RESW)
      • pass2 (Fig3)
        • Instruction을 assemble하여 opcode 생성
        • 변수, 상수위치에 data 대입
        • assemble하여 object program 생성 
        • Fig2. Algorithm of Pass1

        • Fig3. Algorithm of Pass2
    • Assemble하는 과정은 Fig1을 보면 된다. 어셈블러는 어셈블리어를 보고 opcode 포맷을 결정하여 기계어를 생성해야 한다. 프로그래머는 addressing mode를 결정해주는데, #이 붙으면 immediate addressing / @는 indirect addressing, 기본적으로는 simple addressing이다. 이를 통해 flag n,i가 결정됨.
      1. immediate addressing : 해당 label 내 대입된 값을 연산 수행
      2. simple addressing : 해당 label의 주소에 대한 연산
      3. indirect addressing : 해당 label의 값이 주소이며, 이 주소의 값을 연산 수행 (마치 포인터)
    • +를 붙여주면 Format4로 생성하라는 의미이다. 즉 주소를 절대값으로 준다.
    • 왠만하면 Format3가 선호된다. 왜냐하면 1byte가 절약되고, instruction 크기가 bus의 크기와 같아 빠르기 때문이다. 하지만, pc, base와는 동떨어진 위치를 접근해야 할 경우 어쩔수없이 Format4로 접근해야 한다. 
      • pc기준 -2048 <= disp <= 2047 까지 접근 가능 (12bit displacement)
        • 왜냐면..  2's complement따로정리할테니 참고.
      • base기준 0<= disp <=4095까지 접근 가능


    몇가지 참고하면 좋을 자료
    symbol table


    addressing mode

    macro
    preprocessor에서 변환하는 것임 (컴파일러 이전 단계)
    c 변환하는 것이므로 우리가 assembly에서 말하는 directive 노관련

    assembler directives


    2's complement



    댓글

    가장 많이 본 글