• 沒有找到結果。

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

N/A
N/A
Protected

Academic year: 2022

Share "2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能"

Copied!
50
0
0

加載中.... (立即查看全文)

全文

(1)

第 第 第

第2章 章 章 章 組譯器 組譯器 組譯器 組譯器(Assembler)

 基本組譯器功能

 與機器相關之組譯程式功能

 與機器無關之組譯程式功能

 組譯器設計選項

(2)

 組譯程式指引命令

 START 指定程式名稱和起始位址

 END 指示原始程式的結束處,並指定程式中第一個可執行的指令

 BYTE 定義字元或十六進位的常數,並且指出其可佔用之位元組的 數量

 WORD 定義一個字組的整數常數

 RESB 保留所示數量的位元組,供資料區使用

 RESW 保留所示數量的字組,供資料區使用

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

 從輸入裝置(F1)讀入紀錄,並將它們放到輸出裝置(05)

 “ ,X”:表示索引定址

 “.”:表示註解

(3)

SIC組合語言範 組合語言範 組合語言範 組合語言範例 例 例 例

RDREC

副程式副程式- 讀副程式副程式 讀取記取記取記取記錄錄錄錄

WRREC副程式

副程式副程式- 寫出記副程式 寫出記寫出記寫出記錄錄錄錄

(4)

1.

將助憶碼轉換成對應的機器語言,例如將第10行的 STL轉換成14。

2.

把符號運算元轉換成對應的機器位址,例如將第10行 的RETADR轉換成1033。

3.

依適當的格式,建立機器指令。

4.

將原始程式內的常數資料,轉換成機器內部的表示方 式,例如將第80行的EOF轉換成454F46。

5.

產生目的碼程式和組譯列表。

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

將組合語言轉換成目的碼的基本步驟:

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

(5)



前向參考(forward reference)問題



位址轉換



程式涉及一個尚未定義的標記符號(RETADR)



以兩回合的方式解決

第一回:計算指令位址及定義標籤 第二回:組譯指令產生目的碼

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

??

(6)

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能



處理組譯器指令



組譯程式處理虛擬指令

START、END BYTE、WORD RESB、RESW

(7)

目的程式列表

目的程式列表

目的程式列表

目的程式列表

(8)
(9)

 一個簡單的目的程式包括三種記錄:表頭紀錄、本文 紀錄、結尾紀錄。

 紀錄之格式:

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

 表頭記錄:

• 欄 1 H

• 欄 2-7 程式名稱

• 欄 8-13 (3bytes)目的程式的起始位址(16進位值)

• 欄 14-19 (3bytes)的程式的長度,以位元組為單位

(10)

 本文記錄:

• 欄 1 T

• 欄 2-7 此記錄之目的碼的起始位址

• 欄 8-9 此記錄之目的碼的長度(位元組)

• 欄 10-69 目的碼,以16進位表示

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

 結束記錄:

• 欄 1 E

• 欄 2-7 目的程式中第一個可執行指令的位址

(11)

 對應圖2.2的目的程式

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

長度

最多10筆

(12)



第一回合(定義符號)

1.

對於程式中的每一行指令指定位址

2.

記載程式中所有標記符號的值(位址),以供第二回 合處理之用

3.

處理組譯器指引(此項處理會影響位址配置,如決定 BYTE、RESW 所定義之資料段的長度)

組譯器兩回合掃描過程

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

(13)



第二回合(組譯指令並產生目的程式)

1.

將指令轉譯成機器碼,並記錄下位址值

2.

將BYTE、WORD所定義的值轉成16進位,存入 目的程式中

3.

處理在第一回合中尚未處理的組譯程式前導指令

4.

記錄組譯完成的目的程式與程式列表

2.1.1 簡單的 簡單的 簡單的 簡單的SIC組譯器 組譯器 組譯器 組譯器

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

(14)

 資料結構:

 運算碼表 (Operation Code Table; OPTAB)



儲存助憶指令與機器碼之關連

 符號表 (Symbol Table; SYMTAB)



紀錄程式中所使用到符號所代表的值

 程式計數器 (Location Counter ; LOCCTR)

 初始值為START後所指派的值

 每處理一道指令後就將指令長度加入



提供指令及標籤的起始位址

2.1.2 組譯器演算法與資料結構 組譯器演算法與資料結構 組譯器演算法與資料結構 組譯器演算法與資料結構

2.1 基本組譯器功能 基本組譯器功能 基本組譯器功能 基本組譯器功能

(15)

 OPTAB

 存放運算碼,機器碼(包含指令格式及長度資訊)

 為靜態表格

 通常使用Hash Table,使用助憶碼作為key

 第一回合用來檢驗運算碼及計算指令長度

 第二回合用來轉換運算碼至機器碼

(16)

 SYMTAB

 存放每個標籤的名稱, 位址, 與旗標(是否重覆定義)

 資料標籤資訊,如型別與長度



針對BYTE, WORD, RESB, RESW等

 非靜態表格

 可用Hash Table加速搜尋過程,慎選Hash Function

 第一回合:建立標籤及輸入位址資訊

 第二回合:搜尋SYMTAB表,取得標籤位址

(17)

組譯程式第一回合處理演算法 組譯程式第一回合處理演算法組譯程式第一回合處理演算法 組譯程式第一回合處理演算法

(18)
(19)

組譯程式第二回合處理演算法 組譯程式第二回合處理演算法組譯程式第二回合處理演算法 組譯程式第二回合處理演算法

(20)
(21)

 與機器相關的組譯器功能

 指令格式與定址模式

 程式重新定位

 與機器無關的組譯器功能

 定字(literals)

 符號定義指令

 表示式

 程式區塊

 控制區段及程式連結

組譯程式設計

組譯程式設計

組譯程式設計

組譯程式設計

(22)

 SIC/XE版本新增功能:

 @:間接定址,用法OPCODE @SYMBLE

 #:立即資料,用法OPCODE #SYMBLE

 相對定址:引用到記憶體:使用「程式計數器相對模式」或

「基底相對模式」

 BASE:基底相對,用法BASE SYMBLE「立即運算元」則前置 一個「#」符號來表示

 +:使用擴充格式(format 4),用法+OPCODE SYMBLE

 如果位移需要「程式計數器相對模式」及「基底相對位址模式」

時,則因所需空間太大而無法適合於3位元組指令,必須使用4位 元組的擴展格式

 程式設計師必須自行指定此類的定址模式。

2.2 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性

(23)

 間接定址、立即定址、索引定址都必須指定

 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 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性

(24)

RDREC副程式

副程式副程式- 讀副程式 讀取記取記取記取記錄錄錄錄

WRREC副程式

副程式副程式- 寫出記副程式 寫出記寫出記寫出記錄錄錄錄

(25)

 運算元的位址是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)

(26)

 程式計數器相對定址

範例 範例 範例 範例

10 0000 FIRST STL RETADR 17202D

disp= RETADR -PC = 30-3 = 2D

(27)

範例 範例 範例 範例

40 0017 J CLOOP 3F2FEC

 程式計數器相對定址

disp= CLOOP -PC = 6 -1A = -14 = FEC

-14=1111 1110 1011+1=FEC

(28)

範例 範例 範例 範例

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

(29)

 立即定址模式

範例 範例 範例 範例

55 0020 LDA #3 010003

133 103C +LDT #4096 75101000

4096=(01000)16

(30)

範例 範例 範例 範例

12 0003 LDB #LENGTH 69202D

 在此例中,立即運算元是LENGTH符號,由於此符號的值是一個 位址,所以此指令的作用是將LENGTH的位址值載入到B暫存器。

 LENGTH=0033=PC+displ=0006+02D

 立即定址模式

(31)

範例 範例 範例 範例

70 002A J @RETADR 3E2003

 間接定址模式

(32)

 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

(33)

 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

(34)

 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

(35)
(36)
(37)

副程式RDREC

(38)
(39)
(40)
(41)

副程式WRREC

(42)
(43)
(44)

目的碼列表 目的碼列表目的碼列表 目的碼列表

(45)

2.2.2 程式重定位 程式重定位 程式重定位 程式重定位(Relocation)

2.2 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性 與機器相關的組譯器特性

 電腦可能同時載入多個程式進入記憶體執行

 若組譯時給定固定記憶體位址,程式只能被載 入記憶體特定位置執行

 重新定址可解決上述問題

 程式的起始位址在載入記憶體後才確定

(46)

 在圖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

(47)

程式重定址範例

程式重定址範例

程式重定址範例

程式重定址範例

(48)

 欄 1 M

 欄 2-7 需要修改之位址欄的起始位址,此位址乃 相對於程式的起始處(16進制)

 欄 8-9 需要修改之位址欄的長度,以半位元組表 示(16進制)

 以JSUB指令為例,其修改記錄如下:

M00000705

修正記錄 修正記錄 修正記錄 修正記錄

須修改的位址欄位與程式載入點的距離(以 byte為單位)

須修改的須修改的須修改的

須修改的位址欄位長度(以 nibble為單位

(49)

相對於圖 相對於圖 相對於圖

相對於圖2.6的目的程式 的目的程式 的目的程式 的目的程式

(50)

Relocation

 哪些目的碼必須被修改

 記憶體位址

 SIC的記憶體參照

 SIC/XE的記憶體參照

 • 哪些目的碼不必被修改

 immediate addressing,

 PC-relative, BASE-relative,

 沒有參照到記憶體的指令

參考文獻

相關文件

[r]

可程式控制器 (Programmable Logic Controller) 簡稱 PLC,是一種具有微處理機功能的數位電子 設備

print –dtiff my_image.tif: 將目前指定的圖形,產生 TIFF 格式的影像檔,並以my_image.tif 的檔名儲存。.

 MATLAB 程式使用 pass-by-value 的方 式,進行程式與函式間的溝通聯絡,當 程式呼叫函式時, MATLAB

頁:http://politics.ntu.edu.tw/ 。本系教學以口試及 文獻閱讀為主,需具有相當之聽覺功能(含能以助

譯。關於懺罪思想的經典,則早在譯經初期即陸續傳譯。例如《阿闍世 王經》(譯於 147-186 年間)、《舍利弗悔過經》(譯於 148-170

就等同沒說明 śakra 為何譯成 brgya byin。再者,《新訂翻譯名 義大集》第 3140 條已規定:屬於世間天神類的 śatakratuḥ 要譯 作 mchod sbyin brgya pa,那麼若又指出 śatakratu

學校的 ESDA 共有七個主要功能模組,分別為:系統工具(ST), 用戶管理(UM) 、調查 管理(SA)、填寫問卷 (DS)、數據輸入(DI)