320 likes | 589 Vues
第 2 章 組譯器. 2.1 節 : 組譯程式的基本功能 (SIC 標準版組譯程式 ) 2.2 節 : 與機器特性相關的組譯程式特性 2.3 節 : 與機器無關的組合語言特性和實作 2.4 節 : 組譯程式設計上可供選擇的方案 2.5 節 : 組譯程式實例 (MASM 組譯程式 ,SPARC 組譯程式 ). 內容. 組譯器指引( assembler directives ) START 指定程式名稱和起始位址 END 指示原始程式的結束處,並指定程式中第一個可執行的指令 BYTE 定義字元或十六進位的常數 WORD 定義一個字組的整數常數
E N D
2.1節:組譯程式的基本功能(SIC標準版組譯程式) 2.2節:與機器特性相關的組譯程式特性 2.3節:與機器無關的組合語言特性和實作 2.4節:組譯程式設計上可供選擇的方案 2.5節:組譯程式實例(MASM組譯程式,SPARC組譯程式) 內容
組譯器指引(assembler directives) • START 指定程式名稱和起始位址 • END 指示原始程式的結束處,並指定程式中第一個可執行的指令 • BYTE 定義字元或十六進位的常數 • WORD 定義一個字組的整數常數 • RESB 保留所示數量的位元組,供資料區使用 • RESW 保留所示數量的字組,供資料區使用 2.1 基本組譯器功能
此程式範例包含了一個主程式及兩個副程式(RDREC副程式及WRREC副程式)。主程式呼叫RDREC副程式讀取一筆資料記錄後,呼叫WRREC副程式將此資料記錄輸出。此過程一直持續,直到RDREC副程式讀取資料記錄為空,此時由WRREC副程式輸出 ‘EOF’後返回作業系統 (註:假設此程式由被作業系統呼) 。 SIC組合語言程式的範例
RDREC副程式每次被執行時,從輸入設備(F1)16讀入一筆記錄的資料存入 BUFFER陣列,此筆記錄的長度被記載在LENGTH變數。 (註:(1)一筆記錄的資料最長為4096個BYTES (2)當副程式從從輸入設備讀入0,則判定此筆記錄結束)。 WRREC副程式依據LENGTH變數所記載的長度,將存放在BUFFER陣列的資料記錄輸出到輸出設備(05)16。 SIC組合語言程式的範例
將助憶運算符號轉換成對應的機器語言,例如將第10行的STL轉換成14。將助憶運算符號轉換成對應的機器語言,例如將第10行的STL轉換成14。 把符號運算元轉換成對應的機器位址,例如將第10行的RETADR轉換成1033。(向前參考) 依適當的格式,建立機器指令。 將原始程式內的常數資料,轉換成機器內部的表示方式,例如將第80行的EOF轉換成454F46。 產生目的碼程式和組譯列表。 2.1.1 簡易的SIC組譯器
組譯圖2.1程式所產生之具目的碼的程式 Line Loc 標記 助記憶運算符號 符號運算元 機器碼
2.1.1 簡易的SIC組譯器 • 向前參考(forward reference) ---參考(指令的符號運算元使用)到定義在這個指令後方的標記,例如:第10行的FIRST STL RETADR。 • 多數的組譯程式必須以兩階段(two passes)來實施組譯的動作 • 第一階段定義符號及指派位址,第二階段實際完成組譯的動作
一個簡易目的程式的格式中,包括三種記錄:表頭(Header)、本文(Text)、結束(End)。一個簡易目的程式的格式中,包括三種記錄:表頭(Header)、本文(Text)、結束(End)。 2.1.1 簡易的SIC組譯器
表頭記錄: • 欄 1 H • 欄 2-7 程式名稱 • 欄 8-13 目的程式的起始位址(16進位值) • 欄 14-19 目的程式的長度,以位元組為單位 2.1.1 簡易的SIC組譯器
本文記錄: • 欄 1 T • 欄 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.1 簡易的SIC組譯器-二階段之簡易組譯器
2.1.2 組譯器演算法與資料結構 • SIC組合語言指令格式: 標記 助記憶運算符號 符號運算元 • 10 FIRST STL RETADR • 70 LDL RETADR • 95 RETADR RESW 1 • SIC標準版機器碼格式:
資料結構: 運算碼表(Operation Code Table ,簡稱為OPTABE)、符號表(Symbol Table ,簡稱為SMTAB)、位址計數器(Location Counter ,簡稱為LOCCTR)。 演算法:第一階段(定義符號,請見圖2.4(a))、第二階段(組譯指令並產生目的程式,請見圖2.5(b))。 2.1.2 組譯器演算法與資料結構
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指令無符號運算元部份)。
1 SAMPLE1 START 500 2 LAB1 LDA FIVE 3 STA ALPHA 4 LDCH CHART 5STCH C1 6 RSUB 7 ALPHA RESW 1 8 FIVE WORD 5 9 CHART BYTE C’T’ 10 C1 RESB 1 11 END LAB1 試產生以下程式的目的碼(直接定址模式)
1 SAMPLE1 START 500 2 LAB1 LDA FIVE 3 STA ALPHA 4 LDCH CHART 5STCH 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
1 SAMPLE1 START 500 2 LAB1 LDAFIVE 3 STAALPHA 4 LDCHCHART 5STCHC1 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 LDXZERO 3 MOVECH LDCHSTR2,X 4 STCHSTR1,X 5 TIXTWELVE 6 JLTMOVECH 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。 習 題