2.1 assembler
將原始程式翻成machine code
assembler listing (LST file)
獲得相關的地址給出可辨識的列表,進行cross reference。
- x86 的
org
給起始位置 label
、symbol
- 判斷pseudo instruction: 其不會被翻成機器碼
cross reference: 定義的label與對映的address列表出來。
linux可以透過此指令輸出assembler listing
as -aln example.s | less
obj file
用於loader載入使用
assembler
- assembler: 轉換成機器碼之後,將機器碼與symnlolic lables的關聯對映起來。
- disassembler: 將機器碼轉為組合語言
- cross assembler: 透過機器A(如x86)組譯出機器B(arm)的機器碼。
可重定位指令: 載入起始點不同需要計算絕對地址,不過call
、jmp
、LOOP
是計算距離不用relocation。
2.2 SIC Assembly
組譯器指引 assembler directives
start
: 表示address的起始位置end
byte
word
: SIC佔用3 bytesresb
resw
SIC/XE與SIC差異
- 基底相對定址 (Base relative)
- type 4: 指令前方補上加號
disp
主要以pc
為基準計算
PC Relative無法描述位置,則使用base reg reloaction。
,x
: index addressing
2.3 80xx assembly
在翻譯code時,如disp需要以little endian表示
- extern pseudo: 先以
0x0000
定義外部地址,直到連結載入填上位置。 - loop:
LOOP
使用PC加上offset(二補數)
2.4 Assembler Algorithm
組譯器演算法
- 轉譯指令成機器碼
- 獲取symbol對映的address
- 解決forward reference問題
- 處理 pseudo instructions
- 產生obj與assembly listing
通用設計程序
- 軟體生命週期
- 需求分析
- 軟體規格
- 軟體設計
- 實做
- 軟體測試
- 支持與維護
- 軟體設計
- 輸出需求/輸入設計
- 資料結構/演算法
- 將程式模組化
- IO設計
- 輸出要求: assembly listing, object
- 輸入: 組合語言程式碼
- 資料結構
- OPTAB: 存放指令與機器碼對應關聯
- SYMTABLE: 儲存變數與符號的地址
- LOCCTR: 保存當前處理的指令地址
two passes assembler
pass1
主要找出label與addr對應的位置建立SYMTABLE
- 判斷指令長度(透過OPTAB)
- 計算LOCCTR
- 將lable的地址保存到SYMTABLE
- 處理pseudo instruction
pass2
產生obj
- 透過SYMTAB帶入pass1沒有處理的symbol
- 透過OPTABLE產生機器碼
- 計算LOCCTR
- 產生pseudo定義的數據如BYTE, WORD
- 處理pass1未處理的pseudo
2.5 Data Structures
需求
- 輸入程式碼與輸出obj
- 輸出assembly reports 與一些message
- LOCCTR
- OPTAB
- SYMTAB: SIC當中的Type用來判斷是絕對地址或相對地址
- 其他輔助表LITTAB(literal name table)
literal為常數,但定址方式不為立即定址immediate addressing,
例如foo = bar * 35
的35為literal
2.6 Machine Independent Assembler
configuration table
處理forward reference,透過連結串列紀錄有forward reference的位置,保存指令的loc到configuration table,直到對應的addr出現之後,將連結串列透過找到的地址取代。
back認為可能透過1 pass的方式處理,而原始程式forward reference的數量有限,大多數都是接受的情況,因此可以透過configuration table處理。在理論上探討,如在worst case情況下可能效果如同Two pass
- label定義就放入表中,並且填入機器碼
- 指令中label未定義就先用linked list串接。
1 pass是否有辦法解決
- 實務: 可以透過configuration table
- 理論: worst case不能解決
程式重定位
- 絕對定址: 程式必須載入到特定的地址
- 重新定址: 程式必須根據起始位置下去做重定位
- 在載入的時候修改地址(Relative Address)
- 採用基底暫存器,而不用修改地址。
如何解決 relocation
- 加入修改紀錄,保存地址相關的變數,保存在修改紀錄檔內,讓載入器可以讀取。
- 採用基底暫存器,不用修改地址。
- 使用程式計數器,如SIC
2.7 Separate assemble and relocation
SIC obj紀錄
下面以偽代碼表示結構
- H: 程式頭
nibble H, nameLen[2], name[11], programSize[4];
- T: 機器碼片段
nibble T, codeStartAddr[4], codeSize[2], code[65];
- E: 結束程式
nibble E, programeStartAddr[4];
- M: 重定位資訊,主要用於relocation以及外部參考。
nibble M, [4], 修訂碼, 外部參考名稱[8]
// 修訂碼 +-此變數的位置,為program relocation
// &為與此變數相對位置,因為linking無法算出offset,必須在linking才能處理
- R: 外部參考
nibble R, name[71];
- D: 可參考變數
nibble D, varName[8], varAddr[4], repeat[59];
// varAddr通常為相對地址
// repeat: varName and varAddr
外部參考與內部參考
External reference定義在不同function,internal reference定義在相同的function,External definition在function當中定義的symbols,並且其他function有機會使用該symbols
- EXTRN: 產生R紀錄(External reference)
- PUBLIC: 產生D紀錄(External definition)
程式重定位
program relocation與linking需要透過linker/loader處理
- define recordL 可參考變數
- refer record: 外部參考
- modification record: 修改紀錄
Assembler概念
- forward reference: 使用後定義的label,當下無法得知地址,需要2 pass
- backward reference: 使用先定義的label
其他基本概念
- nibble: 4 bit,為1個16進位數值。
System Program