Download presentation
Presentation is loading. Please wait.
1
第2章 組譯器
2
內容 2.1節:組譯程式的基本功能(SIC標準版組譯程式) 2.2節:與機器特性相關的組譯程式特性 2.3節:與機器無關的組合語言特性和實作
2.4節:組譯程式設計上可供選擇的方案 2.5節:組譯程式實例(MASM組譯程式,SPARC組譯程式)
3
2.1 基本組譯器功能 組譯器指引(assembler directives) START 指定程式名稱和起始位址
END 指示原始程式的結束處,並指定程式中第一個可執行的指令 BYTE 定義字元或十六進位的常數 WORD 定義一個字組的整數常數 RESB 保留所示數量的位元組,供資料區使用 RESW 保留所示數量的字組,供資料區使用
4
SIC組合語言程式的範例
5
SIC組合語言程式的範例 此程式範例包含了一個主程式及兩個副程式(RDREC副程式及WRREC副程式)。主程式呼叫RDREC副程式讀取一筆資料記錄後,呼叫WRREC副程式將此資料記錄輸出。此過程一直持續,直到RDREC副程式讀取資料記錄為空,此時由WRREC副程式輸出 ‘EOF’後返回作業系統 (註:假設此程式由被作業系統呼) 。
6
SIC組合語言程式的範例 RDREC副程式每次被執行時,從輸入設備(F1)16讀入一筆記錄的資料存入 BUFFER陣列,此筆記錄的長度被記載在LENGTH變數。 (註:(1)一筆記錄的資料最長為4096個BYTES (2)當副程式從從輸入設備讀入0,則判定此筆記錄結束)。 WRREC副程式依據LENGTH變數所記載的長度,將存放在BUFFER陣列的資料記錄輸出到輸出設備(05)16。
7
2.1.1 簡易的SIC組譯器 將助憶運算符號轉換成對應的機器語言,例如將第10行的STL轉換成14。
把符號運算元轉換成對應的機器位址,例如將第10行的RETADR轉換成1033。(向前參考) 依適當的格式,建立機器指令。 將原始程式內的常數資料,轉換成機器內部的表示方式,例如將第80行的EOF轉換成454F46。 產生目的碼程式和組譯列表。
8
組譯圖2.1程式所產生之具目的碼的程式 Line Loc 標記 助記憶運算符號 符號運算元 機器碼
9
2.1.1 簡易的SIC組譯器 向前參考(forward reference) ---參考(指令的符號運算元使用)到定義在這個指令後方的標記,例如:第10行的FIRST STL RETADR。 多數的組譯程式必須以兩階段(two passes)來實施組譯的動作 第一階段定義符號及指派位址,第二階段實際完成組譯的動作
10
2.1.1 簡易的SIC組譯器 一個簡易目的程式的格式中,包括三種記錄:表頭(Header)、本文(Text)、結束(End)。
11
2.1.1 簡易的SIC組譯器 表頭記錄: 欄 1 H 欄 2-7 程式名稱 欄 8-13 目的程式的起始位址(16進位值)
欄 2-7 程式名稱 欄 8-13 目的程式的起始位址(16進位值) 欄 14-19 目的程式的長度,以位元組為單位
12
2.1.1 簡易的SIC組譯器 本文記錄: 欄 1 T 欄 2-7 此記錄之目的碼的起始位址 欄 8-9 此記錄之目的碼的長度(位元組)
欄 2-7 此記錄之目的碼的起始位址 欄 8-9 此記錄之目的碼的長度(位元組) 欄 10-69 目的碼,以16進位表示
13
2.1.1 簡易的SIC組譯器 結束記錄: 欄 1 E 欄 2-7 目的程式中第一個可執行指令的位址
14
2.1.1 簡易的SIC組譯器 對應圖2.2的目的程式
15
2.1.1 簡易的SIC組譯器-二階段之簡易組譯器 第一階段(定義符號) 為程式中的所有指令設置其位址 記載程式中所有標記符號的值(位址),以供第二階段處理之用 處理組譯器指引(此項處理會影響位址的指派,如決定 BYTE、RESW 所定義之資料段的長度)
16
2.1.1 簡易的SIC組譯器-二階段之簡易組譯器 第二階段(組譯指令並產生目的程式) 組譯指令(將助記憶符號轉譯成機器碼,並尋找符號運算元所對應的位址) 產生 BYTE、WORD 所定義的資料值 處理在第一階段尚未完成之組譯器指引 輸出目的程式和組譯器列表
17
2.1.2 組譯器演算法與資料結構 SIC組合語言指令格式: 標記 助記憶運算符號 符號運算元 10 FIRST STL RETADR
標記 助記憶運算符號 符號運算元 10 FIRST STL RETADR LDL RETADR 95 RETADR RESW SIC標準版機器碼格式:
18
2.1.2 組譯器演算法與資料結構 資料結構: 運算碼表(Operation Code Table ,簡稱為OPTABE)、符號表(Symbol Table ,簡稱為SMTAB)、位址計數器(Location Counter ,簡稱為LOCCTR)。 演算法:第一階段(定義符號,請見圖2.4(a))、第二階段(組譯指令並產生目的程式,請見圖2.5(b))。
19
2.1.2 組譯器演算法與資料結構 Operation Code Table (OPTABE):包含SIC組合語言中所有合法的的助記憶運算符號及其對應的機器碼。 在第一階段中,在OPTAB中搜尋被組譯指令的助記憶運算符號是否找得到,以驗証其正確性(若找不到則為助記憶運算符號打錯等語法錯誤invalid operation code)。 在第二階段中,則將助記憶運算符號所對應的機器碼取出。 (註:組譯器指引並未包含在OPTAB中) 。
20
2.1.2 組譯器演算法與資料結構 Location Counter (LOCCTR):用來輔助位址指派所會使用到的變數(只在第一階段使用)。 一開始它的值被初始化為START敍述後所指定的位址,以後每處理一個述敍 (一般組合語言指令或BYTE、WORD、RESB、RESW等組譯器指引),即將此述敍所對應的長度被加到此變數中。 (若START後未指定位址,則LOCCTR被初使化為0)。
21
2.1.2 組譯器演算法與資料結構 Symbol Table (SYMTAB):包含被組譯原始程式中所有使用到的標記名稱及其對應的位址。
在第一階段中,若被組譯指令若包含標記部份,則將此標記及目前LOCCTR的值(代表此標記被指派的位址)新增至SYMTAB中。(註:若此標記在先前已存在SYMTAB中,則發生符號重覆定義的語法錯誤duplicate symbol)。 在第二階段中,在SYMTAB中搜尋被組譯指令的符號運算元,並取出其對應的位址。 (註:RSUB指令無符號運算元部份)。
22
試產生以下程式的目的碼(直接定址模式) 2 LAB1 LDA FIVE 3 STA ALPHA 4 LDCH CHART 5 STCH C1
1 SAMPLE1 START 500 2 LAB1 LDA FIVE STA ALPHA LDCH CHART 5 STCH C1 RSUB 7 ALPHA RESW 1 8 FIVE WORD 5 9 CHART BYTE C’T’ 10 C1 RESB 1 11 END LAB1
23
LOC 2 LAB1 LDA FIVE (0500)16 3 STA ALPHA (0503)16 4 LDCH CHART
1 SAMPLE1 START 500 2 LAB1 LDA FIVE STA ALPHA LDCH CHART 5 STCH C1 RSUB 7 ALPHA RESW 1 8 FIVE WORD 5 9 CHART BYTE C’T’ 10 C1 RESB 1 11 END LAB1 LOC (0500)16 (0503)16 (0506)16 (0509)16 (050C)16 (050F)16 (0512)16 (0515)16 (0516)16
24
Object code 2 LAB1 LDA FIVE (000512)16 3 STA ALPHA (OC050F)16
1 SAMPLE1 START 500 2 LAB1 LDA FIVE STA ALPHA LDCH CHART 5 STCH C1 RSUB 7 ALPHA RESW 1 8 FIVE WORD 5 9 CHART BYTE C’T’ 10 C1 RESB 1 11 END LAB1 Object code (000512)16 (OC050F)16 (500515)16 (540516)16 (4C0000)16 (000005)16 (54)16
25
試產生以下程式的目的碼(索引定址模式) 1 SAMPLE2 START 1000 2 LAB1 LDX ZERO
3 MOVECH LDCH STR2,X STCH STR1,X TIX TWELVE JLT MOVECH RSUB 8 STR RESB 12 9 STR BYTE C’HELLO WORLD!’ 10 ZERO WORD 0 11 TWELVE WORD 12 12 END LAB1
26
試產生以下程式的目的碼(索引定址模式) 1 SAMPLE2 START 1000 2 LAB1 LDX ZERO
3 MOVECH LDCH STR2,X STCH STR1,X TIX TWELVE JLT MOVECH RSUB 8 STR RESB 12 9 STR BYTE C’HELLO WORLD!’ 10 ZERO WORD 0 11 TWELVE WORD 12 12 END LAB1 LOC (1000)16 (1003)16 (1006)16 (1009)16 (100C)16 (100F)16 (1012)16 (101E)16 (102A)16 (102D)16
27
1 SAMPLE2 START 1000 2 LAB LDX ZERO 3 MOVECH LDCH STR2,X STCH STR1,X TIX TWELVE JLT MOVECH RSUB 8 STR RESB 12 9 STR BYTE C’HELLO WORLD!’ 10 ZERO WORD 0 11 TWELVE WORD 12 12 END LAB1 Oobject code (04102A)16 (50901E)16 (549012)16 (2C102D)16 (381003)16 (4C0000)16 (…4845)16 (000000)16 (00000C)16
28
習 題 請試著組譯以下程式: Page 2-75,第2.1節學習評題第2題。 Figure 1.2(a)~Figure 1.7(a) 加上適當的START及END敘述。 Page 1-46,第1.3節學習評題第1~13題。請寫出SIC標準版的程式後進行組譯。 Page 2-4, 圖 2.1Page 2-6,圖2.2。
29
第一階段-1
30
第一階段-2
31
第二階段-1
32
第二階段-2
Similar presentations