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