970 likes | 1.26k Views
資電學院 計算機概論 F7810. 第八章 系統程式. 陳邦治編著 旗標出版社. 本章重點. 電腦系統是由硬體及軟體所組成 軟體可分為系統程式 ( 或稱為系統軟體 ) 與應用程式 ( 或稱為應用軟體 ) 二類 本章將介紹系統程式中較具代表性的軟體 由於作業系統將在第九章介紹,因此本章的介紹不包括作業系統. 大綱. 電腦軟體分類 組譯程式 巨集處理程式 前置處理程式 連結載入程式 編譯程式. 3. 3. 電腦軟體分類 . 電腦系統是由硬體及軟體所組成 軟體可分為 應用軟體 (application software)
E N D
資電學院計算機概論F7810 第八章 系統程式 陳邦治編著 旗標出版社
本章重點 • 電腦系統是由硬體及軟體所組成 • 軟體可分為系統程式(或稱為系統軟體)與應用程式(或稱為應用軟體)二類 • 本章將介紹系統程式中較具代表性的軟體 • 由於作業系統將在第九章介紹,因此本章的介紹不包括作業系統
大綱 • 電腦軟體分類 • 組譯程式 • 巨集處理程式 • 前置處理程式 • 連結載入程式 • 編譯程式 3 3
電腦軟體分類 • 電腦系統是由硬體及軟體所組成 • 軟體可分為 • 應用軟體(application software) • 系統軟體(system software) • 應用軟體是為了處理某個特定的問題而撰寫的程式,應用軟體也可稱為應用程式(application program)
應用軟體基本定義 • 應用軟體是為了處理某個特定的問題而撰寫的程式,應用軟體也可稱為應用程式(application program) • 常用的應用軟體有二類,分別是: • 市售套裝軟體 • 如電腦遊戲軟體、文書處理軟體及多媒體軟體等等 • 使用者自行撰寫的程式
系統軟體基本定義 • 系統軟體是指電腦系統為維特正常運作或開發應用程式所不可缺少的軟體 • 如作業系統(Operating System;OS)、組譯程式(assembler)、編譯程式(compiler)、直譯程式(interpreter)、載入程式(loader)、連結程式(linker)、巨集處理程式(macro processor)、前置處理器(preprocessor)及公用程式(utility)等軟體 • 系統軟體有時也可稱為系統程式(system program)
應用軟體 • 市售套裝軟體是最常用的應用軟體 • 常見的套裝軟體有 • 「文書處理軟體」、「電子試算表軟體」、「簡報軟體」、「繪圖及影像管理軟體」、「多媒體軟體」、「通訊軟體」及「資料庫管理系統」等,下表為常用的套裝軟體的細部分類及範例
組譯程式 (assembler) • 組譯程式的功能是將組合語言寫成的原始程式翻譯成目的碼 • 組譯程式功能圖 組合語言程式是由指令及資料組成。常用的指令有二種,分別是機器指令(machine instruction)與虛擬指令(pseudo instruction)。機器指令經由組譯程式處理後會產生目的碼;虛擬指令的主要作用是標明程式的開始處及結束處,或給予組譯程式指引,因此虛擬指令經由組譯程式處理後通常不會產生目的碼
組譯程式的工作及輸出 • 組譯程式應執行的工作有以下 5 項 • 將機器指令轉換成相對應的機器碼 • 將符號運算元(symbolic operand)轉換成相對應的機器位址 • 以機器所能接受的格式產生機器指令 • 將資料常數(constant)轉換成機器內部的表示法 • 產生的目的碼(object code)及組合程式列表
目的碼之基本內容 • 組譯程式處理完原始程式碼後將產生目的碼,而目的碼之基本內容應有以下三種 • 標頭記錄(head record) • 記載程式的名稱,程式的起始位址以及程式的長度等三種資訊 • 本文記錄(text record) • 記載程式的內容,包括指令的機器碼,欲載入的位址及資料 • 結束記錄(end record) • 記載程式的結束處,並指定程式第一個開始執行的指令的位址
組譯程式的分類 • 組譯程式依不同的處理方式,通常可以分為三類 • 單次處理組譯程式 • 兩次處理組譯程式 • 多次處理組譯程式
單次處理組譯程式(single pass assembler) • 處理原始程式碼一次並產生的目的碼 • 單次處理組譯程式允許「後方參考」(backward reference),但不允許「前方參考」(forward reference)動作 • 「後方參考」指符號先定義,才引用,而「前方參考」則是指符號未定義前就先引用 • 單次處理組譯程式處理方式如下圖
單次處理組譯程式(cont.) • 因為單次處理組譯程式只掃瞄原始程式碼一次,因此組譯(assemble)時間在三種組譯程式中最短 • 因目的碼未執行最佳化處理(optimization),執行效率可能稍差
單次處理組譯程式範例 • 解: AX、BX、CX及DX為暫存器名稱,因此可直接引用不需定義。此程式段中定義的符號共有三個,分別是LOOP、DATA及SIX,因此僅需針對此三個符號說明即可 (1)「backward reference」指令:JMP LOOP (2)「forward reference」指令:SUB BX, SIX及MOV DX, DATA
兩次處理組譯程式(two pass assembler) • 兩次處理組譯程式的程式結構分為二個部份,分別是Pass 1與Pass 2 • 先由Pass 1處理原始程式後,輸出「中間碼」,Pass 2再處理「中間碼」後輸出目的碼(請注意:不是處理原始程式二次) • Pass1的工作為定義符號(define symbol),而Pass 2的工作則為產生目的程式(generate object code) • 兩次處理組譯程式處理方式如下圖 兩次處理組譯程式允許「前方參考」,通常不會對目的碼執行最佳化處理,因此執行效率可能稍差
多次處理組譯程式(multiple pass assembler) • 多次處理組譯程式會作多次掃瞄的動作,因此允許「前方參考」 • 在第一次處理時先保留這些牽涉到「前方參考」的未定義符號,在往後的幾次處理中再一一的對這些符號作處理 • 可對目的碼執行最佳化處理,因此執行效率較佳 • 因多次處理組譯程式會掃瞄程式碼多次,因此組譯時間在三種組譯程式中最長
多次處理組譯程式範例 • 請說明以下程式段為何需要三次處理的組譯程式才能處理? A EQU B+1 B EQU C+100 C EQU 200 • 解: Pass 1: 定義C的值為200 Pass 2: 定義B的值與C+100相同 Pass 3: 定義A的值與B+1相同並產生目的碼
絕對程式(absolute program) • 「絕對程式」(absolute program)是指必須載入到使用者指定的位址才能執行的程式 • 事實上在同一時刻可能同時會有多個程式在記憶體中由於無法預知這些程式執行的順序,因此無法事先分配程式所實際佔用的記憶體空間 • 因為程式在執行過程中可能因為本身之需求或其他程式之需求而必須將程式碼由目前所佔用的記憶體空間,搬移到另一個記憶體空間來執行 • 基於以上二個原因,可以瞭解「絕對程式」的觀念有嚴重的缺點為滿足程式執行時的實際需求,必須有一種作法可以允許程式能載入不同於原先載入的位址,這種可將程式載入不同於原先載入的位址的動作稱為「重定位」(relocation)
程式重定位 • 為了滿足「重定位」之需求,組譯程式輸出之目的碼中應提供資訊給載入程式,再由載入程式來執行修正位址的動作 • 目的碼中若包含程式載入記憶體時應修改的資料,此種目的碼便稱為「可重定址程式」(relocatable program) • 為了提供目的碼「重定位」能力,組譯程式會在目的碼中多輸出一項稱為修飾記錄(modification record)的資料,修飾記錄內記載了目的碼在載入記憶體時需修改的資訊 • 修飾記錄的內容包含了必須被修改的位址欄位之起始位址及被修改的欄位的長度 • 假設程式中有goto 敘述。若程式提供「重定位」功能,則goto 敘述後方所指定的敘述之位址便必須隨著程式載入位址的不同而連帶被更改
覆疊結構 (overlay structure) • 「覆疊結構」是指將程式中不會同時執行的部份載入到記憶體中相同的位置執行 • 兩次處理組譯程式中的Pass 1與Pass 2,因為先執行Pass 1,再執行Pass 2,滿足「不會同時執行」的條件 • 可讓組譯程式的Pass 1與Pass 2使用相同的記憶體空間來執行,如此一來便可降低兩次處理組譯程式執行時記憶體空間的需求量
常見定址模式 • 不同的定址模式提供了取得運算元內容的不同方法 • 常見定址模式可分為 • 「立即定址模式」、「直接定址模式」、「間接定址模式」、「索引定址模式」、「基底定址模式」及「相對定址模式」六種
立即定址模式(immediate addressing mode) • 立即定址模式是指運算元為指令的一部份,執行時不必再做額外的記憶體存取動作可立即利用運算元的值作運算 • 如「move AX,13H」指令運算元的值為13H(16進位的13),不必再做額外的記憶體存取動作
直接定址模式(direct addressing mode) • 直接定址模式代表指令中運算元之值為資料存放在記憶體中的位址,必須透過此位址作一次記憶體存取的動作才能取得所需的資料,又稱為絕對位址模式(absolute addressing mode)
間接定址模式(indirect addressing mode) • 間接定址模式是指運算元欄內的值是位址,此位址會指向記憶體中之位置,此位置中存放資料在記憶體中的位址
索引定址模式(index addressing mode) • 索引定址模式是指將運算元欄位的值加上索引暫存器(index register)之值即為資料的位址。若要變更存取記憶體中的位置則需變更索引暫存器之值
基底定址模式(base addressing mode) • 基底定址模式是指將運算元欄位的值加上基底暫存器(base register)的值,即為資料的位址。若要變更存取記憶體中的位置則需變更運算元碼之值
相對定址模式(relative addressing mode) • 相對定址模式是指將運算元欄位的值加上程式計數器(program counter)內的值,即為資料的位址
巨集處理程式 • 設計程式時,經常會將一些相關的敘述集合在一起以節省程式設計的時間,常使用的方式有 • 迴圈(loop) • 副程式(subroutine) • 巨集(macro) • 迴圈及副程式的觀念請參考本書「程式設計篇」中之介紹,此處僅介紹巨集
巨集相關觀念 • 巨集又稱為「巨集指令」(macro instruction),用來代表程式中一群常用的敘述 • 「巨集定義」(macro definition)的功用是定義巨集及其所對應的一群敘述 • 「巨集展開」(macro expanding)又稱為「巨集呼叫」(macro call),是指將巨集名稱以相對應的一群敘述取代 • 程式中的「巨集定義」程式段可利用「巨集呼叫」來呼叫 • 當語言處理器處理「巨集呼叫」敘述時會利用「巨集展開」的動作以「巨集定義」來取代「巨集呼叫」敘述
巨集範例 XXXMACRO&參數 巨集程式碼 MEND • 「XXX」表示巨集名稱 • 「巨集程式碼」以「XXX」代表其名稱,必須透過「XXX」巨集名稱來呼叫巨集 • 當程式經由巨集處理程式處理後,巨集處理程式會將程式中所有的巨集名稱替換成相對應的巨集定義內容,因此程式經過巨集處理程式處理後的程式碼將會變長 • 因為巨集的處理模式是用「字串替代」方式(將一條敘述替換成一段敘述群) • 完成巨集處理的程式碼執行時,不會有控制流程(control flow)的轉移,因此執行的速度會比利用副程式設計程式快
巨集的優點 • 使用巨集指令的優點有以下三項 • 程式較易維護 • 程式較易除錯 • 系統較具彈性
C++語言的inline函式 • 在某些知名的近代高階語言也提供了巨集處理的功能,如C++語言 • 在C++語言中提供的「inline函式」便是利用了巨集處理的觀念 • 「inline函式」的作法是在函式的名稱前加上「inline」關鍵字便可讓此函式成為「inline函式」
精選範例 • 單次處理組譯程式通常需要建立「未定義符號表」,假如不允許建立「未定義符號表」,則在下列五種情形的不同組合下各需幾道組譯器: (a) 符號在用到時已定義。 (b) 符號在用到時未定義。 (c) 所有巨集指令呼叫均在巨集指令定義之後。 (d) 巨集指令呼叫可以在巨集指令定義之前。 (e) EQU 敘述內含有未定義符號。 如 AC EQU BASE-1 BASE EQU 15 (A) (a)+(c) (B) (b)+(c) (C) (a)+(d) (D) (b)+(d) (E) (b)+(c)+(e) (F) (b)+(d)+(e) • 解: 處理巨集的問題主要分為二個部份,一為巨集定義,另一則為巨集展開
(A) (a) 符號在用到時已定義 (c) 所有巨集指令呼叫均在巨集指令定義之後 (A)單次處理組譯程式 因為符號及巨集指令均在用到或呼叫時已事先定義好,因此僅需一次處理便可完成所有的工作。執行工作如下: Pass 1:巨集定義、巨集展開、符號定義、產生目的碼。
(B) (b) 符號在用到時未定義。 (c) 所有巨集指令呼叫均在巨集指令定義之後 (B)二次處理組譯程式 由於符號在用到時尚未定義,故需二次處理組譯程式方可處理完成。執行工作分配如下: Pass 1:巨集定義、巨集展開、符號定義。 Pass 2:產生目的碼。
(C) (a) 符號在用到時已定義。 (d) 巨集指令呼叫可以在巨集指令定義之前 (C)二次處理組譯程式 因為 Pass 1 處理符號及巨集的定義,但由於巨集指令的呼叫可在巨集指令定義之前,因此 Pass 1 無法完成組譯工作,故需 2 個 pass 才足夠。執行工作分配如下: Pass 1:巨集定義。 Pass 2:巨集展開、符號定義、產生目的碼
(D) (b) 符號在用到時未定義 (d) 巨集指令呼叫可以在巨集指令定義之前 (D)三次處理組譯程式 (b)符號在用到時未定義:二次處理。 (d)巨集指令呼叫可在巨集指令定義之前:二次處理。 巨集展開與符號定義可合併由一個pass 來處理。故共需3個 pass 來完成這項工作。執行工作分配如下: Pass 1:巨集定義。 Pass 2:巨集展開、符號定義。 Pass 3:產生目的碼
(E) (b) 符號在用到時未定義 (c) 所有巨集指令呼叫均在巨集指令定義之後 (e) EQU 敘述內含有未定義符號 (E)三次處理組譯程式 執行工作分配如下: Pass 1:巨集定義、巨集展開、符號定義(含第一層EQU符號定義) Pass 2:繼續處理第二層EQU符號定義 Pass 3:產生目的碼
(F) (b) 符號在用到時未定義 (d) 巨集指令呼叫可以在巨集指令定義之前 (e) EQU 敘述內含有未定義符號 (F)四次處理組譯程式 執行工作分配如下: Pass 1:巨集定義 Pass 2:巨集展開、符號定義(含第一層EQU符號定義) Pass 3:繼續處理第二層EQU符號定義 Pass 4:產生目的碼
前置處理程式 • 「前置處理程式」是指程式語言處理器在開始處理程式段之前的處理程式 • 本節將以C程式語言為例,說明「前置處理程式」之作法 • 對一個 C 程式而言,程式在被編譯之前,程式會先由C程式語言的「前置處理程式」先負責處理含有「#」開頭的敘述後(如#include 、#define等),再將結果檔交由編譯程式處理後續工作