[System Programming : Build Program] 2. Assembler
이번 챕터에서는 assembly가 기계어로 바꾸는 방식을 상당히 자세히 다뤄볼 것이다. 이는 후에 내가 언젠간 배워야지 생각하는 보안의 reverse engineering과도 밀접히 연관되어 있을 것 같다. 다음학기에 공부해서 정리해야지.
2's complement
- Terminology 는 늘 암기하자!
- mnemonic : opcode의 assembly단에서 symbolic name이며, instruction임
- assembler directives : machine code로 바뀌진 않으며, assembler에게 지시하는 지시자. 즉 어셈블러가 machine code로 변환하는 과정에서 알아야 하는 정보들 (#define같은 전처리기 macro랑 아예 다른 개념이니 주의!)
- 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)
- Assemble하는 과정은 Fig1을 보면 된다. 어셈블러는 어셈블리어를 보고 opcode 포맷을 결정하여 기계어를 생성해야 한다. 프로그래머는 addressing mode를 결정해주는데, #이 붙으면 immediate addressing / @는 indirect addressing, 기본적으로는 simple addressing이다. 이를 통해 flag n,i가 결정됨.
- immediate addressing : 해당 label 내 대입된 값을 연산 수행
- simple addressing : 해당 label의 주소에 대한 연산
- 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
댓글
댓글 쓰기