Professional Documents
Culture Documents
第 4 章、組譯器
作者:陳鍾誠
旗標出版社
第 4 章、組譯器
4.1 組譯器簡介
4.2 組譯器的演算法
4.3 完整的組譯範例
4.4 進階的組譯器功能
4.5 實務案例
4.5.1 微軟的組譯工具
4.5.2 GNU 組譯工具
4.1 組譯器簡介
何謂組譯器?
組譯器乃是將組合語言轉換為目的 的工具。
是組合語言程式設計師所使用的主要工具。
圖 4.1 組譯器的過程示意圖
組合語言
目的檔
15 52 20 00
組譯器
13 12 50 00
Assembler
13 24 20 00
範例 4.1 簡單的組合語言程式
行號 組合語言程式碼 說明
1 EX1 START 程式開始
2 0x0100 載入記憶體變數 B 到暫存器 R1 當中
3 LD R1, B 將暫存器 R1 存回記憶體變數 A 當中
4 ST R1, A 保留一個字組 (Word) 給變數 A
5 A RESW 1 宣告變數 B 為字組,並設初值為 29
6 B WORD 29 程式結束
END EX1
範例 4.2 為組合語言程式加上目的碼
類 格式 指令 OP 意義 範例 說明
型
載 B LD 00 載入 LD Ra Ra[Rb+ Mx]
入 B ST 01 (word)
儲存 [Rb+Mx]
ST Ra [Rb+ Ra[ Rb+ Mx]
儲 B LDB 02 (word)
載入 (byte) Mx] Ra [Rb+
LDB Ra(byte)[Rb+
存 B STB 03 儲存 (byte) Mx] Ra [Rb+
STB Mx]
Ra(byte)[Rb+
… … … … … Mx]
… Mx]
…
絕對定址 v.s. 相對定址
2. 參數轉換:將符號運算元轉換成機器位址,例如
A 轉為 0108 , B 轉為 010C 等。
3. 資料轉換:將原始程式當中的資料常數轉換為內
部的機器碼,例如 29 轉換為 001D 。
4. 目的碼產生:以適當的格式建立機器指令,產生
目的程式。
4.2 組譯器的演算法
第一階段 (PASS1)
計算符號位址
第二階段 (PASS2)
產生目的碼
第一階段 ( 計算符號位址 )
1. 決定每一個指令與假指令所占記憶空間的大小
例如決定 WORD 、 RESW 等指令所定義的資料長度,以及
LD 、 ST 等指令所佔空間的大小。
2. 指定程式當中所有指令與資料的位址
像是行號 2 為 0100 ,行號 3 為 0104 等。
3. 儲存每一個標籤與變數的記憶體位址
方便第二階段使用。像是變數 A 為 0108 ,變數 B 為 010C
等。
第二階段 ( 組譯指令與資料 )
1. 轉換組合語言指令助憶碼為機器碼
2. 轉換指令參數為機器碼
3. 轉換資料定譯指令為位元
例如 WORD B 29 轉為 00 00 00 1D 等。
4. 產生目的碼並輸出到目的檔當中。
組譯器的資料結構
範例 4.4 資料結構 1 - 指令表格
LD 00
ST 01
LDB 02
....
組譯報表
目的檔
範例 4.6 組合語言 ( 加總功能 )
範例 4.6 的組譯報表
範例 4.6 的目的
4.4 進階的組譯器功能
定址範圍的問題
實字 (Literal) :直接將常數寫在指令中
LTORG : 將實字列出
ORG : 回到某個位址
EQU : 以名稱代表常數或符號運算式
定址範圍的問題
常數值的表示法
範例 4.11 實字 (Literal) 的組合語
言程式範例
範例 4.12 以 LTORG 提早展開實字的範
例
範例 4.13 使用 EQU 假指令的組合
語言程式片段
範例 4.14 使用 EQU 進行相對位址
模擬 C 語言的 struct 結構
範例 4.15 使用 EQU 與星號 * 模擬
C 語言的 struct 結構
範例 4.16 使用 ORG 假指令的組合
語言程式片段
範例 4.17 使用運算式計算陣列大小
的組合語言程式片段
範例 4.18 以 USE 區塊解決巨大陣列
所造成的定址問題
4.5 實務案例
4.5.1 微軟的組譯工具
還可將 C 語言編譯為組合語言
4.2 組譯器的演算法
第一階段:計算符號位址
第二階段:將指令轉為目的碼
4.3 完整的組譯範例
陣列加總功能
第 4 章、組譯器 ( 摘要 2)
4.4 進階的組譯器功能
Literal ( 實字 ) 、常數、 EQU, ORG, *, …
4.5 實務案例
4.5.1 微軟的組譯工具
o 在 Visual Studio 中撰寫組合語言
4.5.2 GNU 組譯工具
o 使用 gcc 編譯 C 程式為組合語言,並修改之
o 於 C 語言中內嵌組合語言 ( 使用 GNU 的內嵌語法 )