Post on 13-Sep-2020
第第第第2章章章章組譯器組譯器組譯器組譯器(Assembler)
� 與機器無關之組譯程式功能
� 組譯器設計選項
� 「定字」(literal)
� 符號定義敘述(EQU及ORG)
� 運算式(Expression)
� 程式區段(Program Blocks )
� Control Sections(控制區塊)and Program Linking(程式連結)
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
範例範例範例範例
� 將常數運算元的值當成指令的一部份
� 避免在程式的其他區段定義這常數,並給予常數一個標記。此種運算元稱之為「定字定字定字定字」(literal)。
� 在組合語言中,使用“="來判定
� 例如:� 45 001A ENDFIL LDA =C'EOF' 032010
� 215 1062 WLOOP TD =X’05’ E32011
2.3.1 定字定字定字定字
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
目的碼目的碼目的碼目的碼
Literals vs. Immediate Operands
� 運算元的值被組譯成機器指令的一部份
� e.g. 55 0020 LDA #3 010003
� 組譯器將特定值產生成某一個記憶體位置的常數
� eg. 45 001A ENDFIL LDA =C’EOF’032010
� …
� 93 LTORG
� 002D * =C’EOF’
LTORG
� 通常定字(literals) 被放置在程式結尾的池中
� 定字池(Literal pools)
� LTORG
� 希望定字被放置在目的程式的特定位置
� 希望定字運算元(literal operand) 靠近指令
� 定字表(LITTAB):
� 針對每個常值,此表格包含常值名稱、運算元值及長度,以及運算元位於常值區的位址。
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
定字表定字表定字表定字表(((( LITTAB)
10761 BYTE05=X’05’
002D3 BYTE454F46=C’EOF’
addresslengthvaluename
� 第一回合(Pass 1)� 先在LITTAB 中建立定字名稱(literal name)、運算元的值和長度(operand value and length),不指定位址
� 當碰到LTORG 敘述時,針對尚未指定位址的每一個定字指定一個位址
� 第二回合(Pass 2)� 對每一個碰到的定字運算元,搜尋LITTAB
� 使用BYTE 或WORD 敘述,產生值
� 對於定字產生修改紀錄(modification record),用以表示在程式中的位址
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
產生定字表產生定字表產生定字表產生定字表(((( LITTAB)
� 定義符號(symbol)並指定數值
符號符號符號符號 EQU 值值值值
� 例1:MAXLEN EQU 4096
+LDT #MAXLEN
� 例2:BASE EQU R1
COUNT EQU R2
INDEX EQU R3
2.3.2 符號定義敘述符號定義敘述符號定義敘述符號定義敘述
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
+LDT #4096
� 間接指定值給符號
� 將位置計數器(LOCCRT) 的值重新設定為所指定值
ORG 值值值值
� Example
� SYMBOL: 6bytes
� VALUE: 1word
� FLAGS: 2bytes
� LDA VALUE, X
2.3.2 符號定義敘述符號定義敘述符號定義敘述符號定義敘述
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
� STAB RESB 1100
� SYMBOL EQU STAB
� VALUE EQU STAB+6
� FLAGS EQU STAB+9
� STAB RESB 1100
� ORG STAB
� SYMBOLRESB 6
� VALUE RESW 1
� FLAGS RESB 2
� ORG STAB+1100
� Using EQU statements
� Using ORG statements
2.3.2 符號定義敘述符號定義敘述符號定義敘述符號定義敘述
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
較易看出表格組成欄位較易看出表格組成欄位較易看出表格組成欄位較易看出表格組成欄位
� 下列的指令順序是允許的
ALPHA RESW 1
BETA EQU ALPHA
� 下列的指令順序是不允許的 (no forward reference)
BETA EQU ALPHA
ALPHA RESW 1
2.3.2 符號定義敘述符號定義敘述符號定義敘述符號定義敘述
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
� 無法處理:向前引用
ALPHA EQU BETA
BETA EQU DELTA
DELTA RESW 1
2.3.2 符號定義敘述符號定義敘述符號定義敘述符號定義敘述
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
� 運算式可以分成絕對運算式或是相對運算式
� 組譯程式允許由 + - * / 等運算子形成算術運算式, 例:� 106 BUFEND EQU *
� 107 MAXLEN EQU BUFEND-BUFFER
� 錯誤:BUFEND + BUFFER、100 – BUFFER或 3 * BUFFER
� 程式中所定義的符號之型態
2.3.3 運算式運算式運算式運算式
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
� 程式區塊(Program block )表示可以在個別目的程式單元中重新安排的區段碼,實際上可包含原始程式中數個獨立區段(segment)。組譯器可重新組合區段,把個區塊的片段組合起來
� 單一目的程式中重新排列的程式碼區段
USE [blockname]
� 一開始,程式敘述設定為未命名(預設)區塊的一部份
� 如果沒有使用USE敘述,整個程式被視為單一的區塊
� 例: Figure 2.11
� 實際上,每一個程式區段可能包含好幾個原始程式中的程式碼區段
2.3.4 程式區塊程式區塊程式區塊程式區塊
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
� 第一回合
� 每一個程式區塊有一個別的位址計數器(location counter)
� 每一個標記(label)所被指定的位址相對於包含它的區塊開始位址
� 在第一次執行的結束, 對於每一個區塊之位址計數器的最新值表示這個區塊的長度
� 組譯器然後能夠在目的程式中指定每個程式區塊一個開始位址
� 第二回合
� 每一個符號的位址能夠利用所指定區塊的起始位址加上這個符號相對於此區塊的相對位址計算出來
2.3.4 程式區塊程式區塊程式區塊程式區塊
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
�在每一行原始程式中,給定一個相對位址和一個區塊號碼
�對於絕對符號,不需要區塊號碼,例:line107
�例:
20 0006 0 LDA LENGTH 032060
LENGTH=(Block 1)+0003= 0066+0003= 0069
LOCCTR=(Block 0)+0009= 0009
2.3.4 程式區塊程式區塊程式區塊程式區塊
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
,,,,
� 採用程式區段的好處
� 增加程式的可讀性(Program readability)
�不需要在lines 15, 35, 65 中的擴充指令格式
�不需要使用在(line 13, 14) 中的基底相對定址
�在(line 253) 使用LTORG 是確保這些實字被放置在任何大
塊資料區域之前
� A 目的程式碼(Object code)
�不需要實際重新排列在目的程式所產生的程式碼。
� Fig. 2.13, Fig. 2.14
2.3.4 程式區塊程式區塊程式區塊程式區塊
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
目的程式目的程式目的程式目的程式
追蹤圖追蹤圖追蹤圖追蹤圖2.11經過組譯與載入過程的程式區塊經過組譯與載入過程的程式區塊經過組譯與載入過程的程式區塊經過組譯與載入過程的程式區塊
� 控制段(control section)是程式的一部份,並且在經過組譯後仍然保有原來的本質;各個控制段皆可獨自載入和重定址
� 不同的控制段通常是扮演副程式,或程式內的邏輯單元
� 程式設計師可以各別組譯、載入和處理各個控制段
� 控制段之間的引用,稱之為「外部引用」(External reference)
2.3.5 控制段與程式連結控制段與程式連結控制段與程式連結控制段與程式連結
2.3 與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性與機器無關的組譯特性
� 定義記錄定義記錄定義記錄定義記錄
� 引用記錄引用記錄引用記錄引用記錄
� 修正記錄修正記錄修正記錄修正記錄(已修改過已修改過已修改過已修改過)
� 修正記錄修正記錄修正記錄修正記錄
相對於圖相對於圖相對於圖相對於圖2.15的目的程式的目的程式的目的程式的目的程式
相對於圖相對於圖相對於圖相對於圖2.15的目的程式的目的程式的目的程式的目的程式
相對於圖相對於圖相對於圖相對於圖2.15的目的程式的目的程式的目的程式的目的程式
� 2.4.1 描述單階段組譯器的結構和邏輯
� 2.4.2介紹多階段組譯器的概念
2.4 組譯器設計選項組譯器設計選項組譯器設計選項組譯器設計選項
� 主要嘗試使用單階段組譯,並考量向前引用。
� 要求程式在引用資料項之前,必定在原始程式中先行定義。
� 程式的邏輯經常需要向前跳躍
� 二種主要的類型
� 一種是直接在記憶體裡產生目的碼
� 另一種類型是產生通常的目的碼程式
2.4.1 單階段組譯器單階段組譯器單階段組譯器單階段組譯器
2.4 組譯器設計選項組譯器設計選項組譯器設計選項組譯器設計選項
單階段組譯器的範例程式單階段組譯器的範例程式單階段組譯器的範例程式單階段組譯器的範例程式
� 首先所討論的單階段組譯器,可以在記憶體產生目的碼,以便立即執行。既不會產生目的碼程式,也不需要載入器。
� 當組譯器掃瞄原始程式時,只產生目的碼指令,如果一個指令的運算元是一個尚未定義的符號,該指令被組譯時,將先忽略此運算元的位址,但是會將此運算元的符號置入符號表內
� 當遇到此符號的定義時,將會掃瞄該符號的向前引用串列(如果存在時),而且將正確的位址置入先前的目的碼指令中。
� 在EQU組譯器指引的討論中,任何在EQU右邊的符號都必須在原始程式中事前有所定義。
� 對ORG來說,也有類似的需求。
� 多階段組譯器
� 第一階段時,將程式中涉及符號定義之向前引用的部份儲存起來,而後再依所儲存的定義進行額外處理,接著才執行正常的第二階段處理。
2.4.2 多階段組譯器多階段組譯器多階段組譯器多階段組譯器
2.4 組譯器設計選項組譯器設計選項組譯器設計選項組譯器設計選項
多階段組譯器範例多階段組譯器範例多階段組譯器範例多階段組譯器範例::::
Line 1
Line 2
Line 3
Line 4
Line 5