第 第 第
第2章 章 章 章 組譯器 組譯器 組譯器 組譯器(Assembler)
基本組譯器功能
與機器相關之組譯程式功能
與機器無關之組譯程式功能
組譯器設計選項
組譯程式指引命令
START 指定程式名稱和起始位址
END 指示原始程式的結束處,並指定程式中第一個可執行的指令
BYTE 定義字元或十六進位的常數,並且指出其可佔用之位元組的 數量
WORD 定義一個字組的整數常數
RESB 保留所示數量的位元組,供資料區使用
RESW 保留所示數量的字組,供資料區使用
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
從輸入裝置(F1)讀入紀錄,並將它們放到輸出裝置(05)
“ ,X”:表示索引定址
“.”:表示註解
SIC組合語言範 組合語言範 組合語言範 組合語言範例 例 例 例
主主 主主 程 程 程 程 式 式 式 式
RDREC
副程式副程式- 讀副程式副程式 讀讀讀取記取記取記取記錄錄錄錄WRREC副程式
副程式副程式- 寫出記副程式 寫出記寫出記寫出記錄錄錄錄1.
將助憶碼轉換成對應的機器語言,例如將第10行的 STL轉換成14。2.
把符號運算元轉換成對應的機器位址,例如將第10行 的RETADR轉換成1033。3.
依適當的格式,建立機器指令。4.
將原始程式內的常數資料,轉換成機器內部的表示方 式,例如將第80行的EOF轉換成454F46。5.
產生目的碼程式和組譯列表。2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
將組合語言轉換成目的碼的基本步驟:
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
第一回:計算指令位址及定義標籤 第二回:組譯指令產生目的碼
2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
??
2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
處理組譯器指令 組譯程式處理虛擬指令START、END BYTE、WORD RESB、RESW
目的程式列表
目的程式列表
目的程式列表
目的程式列表
一個簡單的目的程式包括三種記錄:表頭紀錄、本文 紀錄、結尾紀錄。
紀錄之格式:
2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
表頭記錄:
• 欄 1 H
• 欄 2-7 程式名稱
• 欄 8-13 (3bytes)目的程式的起始位址(16進位值)
• 欄 14-19 (3bytes)的程式的長度,以位元組為單位
本文記錄:
• 欄 1 T
• 欄 2-7 此記錄之目的碼的起始位址
• 欄 8-9 此記錄之目的碼的長度(位元組)
• 欄 10-69 目的碼,以16進位表示
2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
結束記錄:
• 欄 1 E
• 欄 2-7 目的程式中第一個可執行指令的位址
對應圖2.2的目的程式
2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
長度
最多10筆
1.
對於程式中的每一行指令指定位址2.
記載程式中所有標記符號的值(位址),以供第二回 合處理之用3.
處理組譯器指引(此項處理會影響位址配置,如決定 BYTE、RESW 所定義之資料段的長度)組譯器兩回合掃描過程
2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
1.
將指令轉譯成機器碼,並記錄下位址值2.
將BYTE、WORD所定義的值轉成16進位,存入 目的程式中3.
處理在第一回合中尚未處理的組譯程式前導指令4.
記錄組譯完成的目的程式與程式列表2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
資料結構:
運算碼表 (Operation Code Table; OPTAB)
儲存助憶指令與機器碼之關連符號表 (Symbol Table; SYMTAB)
紀錄程式中所使用到符號所代表的值程式計數器 (Location Counter ; LOCCTR)
初始值為START後所指派的值
每處理一道指令後就將指令長度加入
提供指令及標籤的起始位址2.1.2 組譯器演算法與資料結構 組譯器演算法與資料結構 組譯器演算法與資料結構 組譯器演算法與資料結構
2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能
OPTAB
存放運算碼,機器碼(包含指令格式及長度資訊)
為靜態表格
通常使用Hash Table,使用助憶碼作為key
第一回合用來檢驗運算碼及計算指令長度
第二回合用來轉換運算碼至機器碼
SYMTAB
存放每個標籤的名稱, 位址, 與旗標(是否重覆定義)
資料標籤資訊,如型別與長度
針對BYTE, WORD, RESB, RESW等非靜態表格
可用Hash Table加速搜尋過程,慎選Hash Function
第一回合:建立標籤及輸入位址資訊
第二回合:搜尋SYMTAB表,取得標籤位址
組譯程式第一回合處理演算法 組譯程式第一回合處理演算法組譯程式第一回合處理演算法 組譯程式第一回合處理演算法
組譯程式第二回合處理演算法 組譯程式第二回合處理演算法組譯程式第二回合處理演算法 組譯程式第二回合處理演算法
與機器相關的組譯器功能
指令格式與定址模式
程式重新定位
與機器無關的組譯器功能
定字(literals)
符號定義指令
表示式
程式區塊
控制區段及程式連結
組譯程式設計
組譯程式設計
組譯程式設計
組譯程式設計
SIC/XE版本新增功能:
@:間接定址,用法OPCODE @SYMBLE
#:立即資料,用法OPCODE #SYMBLE
相對定址:引用到記憶體:使用「程式計數器相對模式」或
「基底相對模式」
BASE:基底相對,用法BASE SYMBLE「立即運算元」則前置 一個「#」符號來表示
+:使用擴充格式(format 4),用法+OPCODE SYMBLE
如果位移需要「程式計數器相對模式」及「基底相對位址模式」
時,則因所需空間太大而無法適合於3位元組指令,必須使用4位 元組的擴展格式
程式設計師必須自行指定此類的定址模式。
2.2 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性
間接定址、立即定址、索引定址都必須指定
PC-relative定址與Base-relative定址沒有指定如何決定
組譯器自行決定
決定定址模式時,先試著用PC-relative定址
PC-relative定址不行,試Base-relative定址
PC-relative與Base-relative定址都不行,有指定+:用format 4
PC-relative與Base-relative定址都不行,沒有指定+:錯誤
2.2.1 指令格式與定址模式 指令格式與定址模式 指令格式與定址模式 指令格式與定址模式
2.2 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性
主主 主主 程 程 程 程 式 式 式 式
RDREC副程式
副程式副程式- 讀副程式 讀讀讀取記取記取記取記錄錄錄錄WRREC副程式
副程式副程式- 寫出記副程式 寫出記寫出記寫出記錄錄錄錄運算元的位址是1036,當e位元設為 1 時,表示使用擴 展指令格式,則可以存放完整的位址(full address)。
範例 範例 範例 範例
15 0006 CLOOP +JSUB RDREC 4B101036
010010 1 1 0 0 0 1 0000 0001 0000 0011 0110 4 B 1 0 1 0 3 6
op(6) n i x b p e disp(20)
程式計數器相對定址
範例 範例 範例 範例
10 0000 FIRST STL RETADR 17202D
disp= RETADR -PC = 30-3 = 2D
範例 範例 範例 範例
40 0017 J CLOOP 3F2FEC
程式計數器相對定址
disp= CLOOP -PC = 6 -1A = -14 = FEC
-14=1111 1110 1011+1=FEC
範例 範例 範例 範例
12 0003 LDB #LENGTH 69202D 13 BASE LENGTH
160 104E STCH BUFFER,X 57C003
175 1056 EXIT STX LENGTH 134000
基底相對定址
BASE為組譯指令,告訴組譯器BASE暫存器內容可用
NOBASE組譯指令,告訴組譯器BASE暫存器內容不可用
disp= BUFFER-PC=0036-1051= -101B -101B超過程式計數器相對定 址範圍,所以使用BASE-related定址 disp= BUFFER-B=0036-0033=3
disp= LENGTH-PC=0033-1059= -1026 超過程式計數器相對定址範 圍,所以使用基底相對定址 disp= LENGTH-B=0033-0033=0
立即定址模式
範例 範例 範例 範例
55 0020 LDA #3 010003
133 103C +LDT #4096 75101000
4096=(01000)16
範例 範例 範例 範例
12 0003 LDB #LENGTH 69202D
在此例中,立即運算元是LENGTH符號,由於此符號的值是一個 位址,所以此指令的作用是將LENGTH的位址值載入到B暫存器。
LENGTH=0033=PC+displ=0006+02D
立即定址模式
範例 範例 範例 範例
70 002A J @RETADR 3E2003
間接定址模式
5 0000 COPY START 0
程式開始
10 0000 FIRST STL RETADR 17202D
displacement= RETADR -PC = 30-3 = 2D
12 0003 LDB #LENGTH 69202D
立即運算元(immediate operand)為LENGTH
LENGTH 的位址被載入到暫存器B
LENGTH=0033=PC+displacement=0006+02D
if immediate mode is specified, the target address becomes the operand
(B)=0033
13 BASE LENGTH
虛擬指令
15 0006 CLOOP +JSUB RDREC 4B101036
Op code + n i x b p e + 20bit displacement
48 (1 1) (0 0 0 1) + 01036(絕對位址)
20 000A LDA LENGTH 032026
0033=000D+disp
Op code + n i x b p e + 12bit displacement
00 (1 1) (0 0 1 0) + 026
25 000D COMP #0 290000
op code + n i x b p e + 12bit displacement
28 (0 1) (0 0 0 0) + 000
30 0010 JEQ ENDFIL 332007
001A=0013+disp
Op code + n i x b p e + 12bit displacement
30 (1 1) (0 0 1 0) + 007
35 0013 +JSUB WRREC 4B10105D
Op code + n i x b p e + 20bit displacement
48 (1 1) (0 0 0 1) + 0105D(絕對位址)
40 0017 J CLOOP 3F2FEC
displacement= CLOOP -PC = 6 -1A = -14 = FEC
0006=001A+disp
Op code + n i x b p e + 12bit displacement
3C (1 1) (0 0 1 0) + FEC
45 001A ENDFIL LDA EOF 032010
002D=001D+disp
Op code + n i x b p e + 12bit displacement
00 (1 1) (0 0 1 0) + 010
50 001D STA BUFFER 0F2016
0036=0020+disp
Op code + n i x b p e + 12bit displacement
0C (1 1) (0 0 1 0) + 016
副程式RDREC
副程式WRREC
目的碼列表 目的碼列表目的碼列表 目的碼列表
2.2.2 程式重定位 程式重定位 程式重定位 程式重定位(Relocation)
2.2 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性
電腦可能同時載入多個程式進入記憶體執行
若組譯時給定固定記憶體位址,程式只能被載 入記憶體特定位置執行
重新定址可解決上述問題
程式的起始位址在載入記憶體後才確定
在圖2.3的目的碼程式中,此指令是轉譯成00102D,而 且位址 102D的內容將載入到A暫存器中。
目的碼內使用102D(絕對位址)來參照THREE
若程式被載入2000h
要解決此問題,目的碼的絕對位址必須被修改
將目的碼必須被修改的部份標示出來
內含位址修改資訊的程式稱為可重定位程式
2.2.2 程式重定位 程式重定位 程式重定位 程式重定位
2.2 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性
55 101B LDA THREE 00102D
如圖2-2的SIC範例程式:
絕對位址程式
55 201B LDA THREE 00102D
程式重定址範例
程式重定址範例
程式重定址範例
程式重定址範例
欄 1 M
欄 2-7 需要修改之位址欄的起始位址,此位址乃 相對於程式的起始處(16進制)
欄 8-9 需要修改之位址欄的長度,以半位元組表 示(16進制)
以JSUB指令為例,其修改記錄如下:
M00000705
修正記錄 修正記錄 修正記錄 修正記錄
須修改的位址欄位與程式載入點的距離(以 byte為單位)
須修改的須修改的須修改的
須修改的位址欄位長度(以 nibble為單位
相對於圖 相對於圖 相對於圖
相對於圖2.6的目的程式 的目的程式 的目的程式 的目的程式
Relocation
哪些目的碼必須被修改
記憶體位址
SIC的記憶體參照
SIC/XE的記憶體參照
• 哪些目的碼不必被修改
immediate addressing,
PC-relative, BASE-relative,
沒有參照到記憶體的指令