Download presentation
Presentation is loading. Please wait.
Published byAngèle Joly Modified 6年之前
1
Ch07 低階程式語言 目標---研讀完本章後,你應該可以: 列出電腦可以執行的動作。 討論抽象階段與訂定具體演算步驟的關係。
描述出 Pep/7 虛擬機器的重要特徵。 分辨出立即定址模式(immediate addressing mode)及直接定址模式(direct addressing mode)的不同。 將一簡單的演算法則轉換成機器語言程式。 分辨出機器語言(machine language)及組合語言(assembly language) 的不同。 將一簡單的演算法則轉換成組合語言程式。 分辨出要送給組譯器的指令及將被轉譯的指令。 對一個簡單的組合語言程式,設計及實現一個測試程式計畫。 25 Ch07 低階程式語言
2
7.1 電腦的動作 一部電腦是一個可程式化的電子裝置,它可以儲存、擷取及運算資料。
資料及運用資料的指令在邏輯上是相同的, 他們都是 0 與 1 的序列,而且可以儲存在相同地方(指記憶體及檔案),這也是范紐曼機器的基本概念。 儲存、擷取及運算就是電腦處理資料的動作,也就是可程式化的概念。 運算包括所有資料數值的加減乘除等算術及邏輯運算式的求值 Ch07 低階程式語言
3
7.2 抽象(abstraction)階段 一個抽象步驟是許多細節尚未定義完整,而一個具體步驟則是將細節完整定義好。
如何知道演算法(一個演算法是指在有限時間內,使用有限資料來解決一個問題或子問題的一組指令)中某個步驟是否夠具體? 取決於程式語言的支援程度 我們會在第 7 章之後介紹第 6 章演算法,之後第 8、9 章將說明如何將虛擬碼轉成高階程式語言。 本章先由機器語言 (machine language) 開始,它是伴隨硬體產生的語言;逐漸轉到組合語言 (assembly language) 。 Ch07 低階程式語言
4
7.3 機器語言 機器語言 (machine language) 電腦唯一真正能執行的程式指令,這些指令依照特定電腦功能建立於硬體中。
所有的處理器系列(CPU series) 型態都有自己獨特的一組機器指令。 這些指令被賦予一個編碼 (以 0 與 1 的字串表示) 處理器及其所能執行的機器指令之間的關係是完全整合在一起的。 每一個機器語言指令僅僅做了一個非常低階的工作,例如 “將某記憶體位址的內容上載到 CPU 的累加器暫存器”。 即使是將 2 個數字相加也要用到 3 個指令 目前已沒有人直接用機器語言寫程式 Ch07 低階程式語言
5
機器語言程式範例 將 0 與 1 的位元串以 16 進制表示,最後以 zz 表示程式結束, zz 是用來告訴 Pep7 模擬器 “不用再往下讀了”,不是機器語言程式的一部份 Ch07 低階程式語言
6
Pep/7:一個虛擬電腦 一個虛擬電腦就是一台假想的機器,但是包含了真實電腦所應具備的一些重要特徵。
由Stanley Warford 所設計的Pep/7 就是一台我們在本章中要討論的虛擬機器。 最新版本為 Pep/8 Pep/7 具有32個機器語言指令(所以需要 5 個位元來表示各個指令) 我們不完整介紹 Pep/7 所有指令,只看其中幾個指令,重點在了解機器語言如何運作 Ch07 低階程式語言
7
Pep/7 的重要特徵 Pep/7的記憶單元是由 4,096 (212)位元組的記憶體所組成。所以需要 12 個位元來表示某一記憶體位置
Pep/7的字語長度是 2個位元組(即 16 個位元 ),表示資訊流入或流出 ALU 的基本長度是 16 位元 在Pep/7中含有 7 個暫存器,其中 我們會用到以下3 個: 程式計數器 (PC, Program Counter),2 bytes,存放下一個將被執行的指令的記憶體位址。 指令暫存器 (IR, Instruction Register),3 bytes,儲存目前正在執行的指令之編碼。 累加器 (A暫存器, Accumulator),2 bytes,存放資料或運算後的結果。 Ch07 低階程式語言
8
Pep/7 的重要特徵 在Pep/7中含有四個狀態位元,其中我們將探討以下兩個:
狀態位元 N (Negative):當累加器為負數時其值為1,否則其值為0。 狀態位元 Z (Zero):當累加器為 0 時其值為1,否則其值為0。 這兩個位元的設定是由硬體自動處理 狀態位元用於設計 迴圈 及 IF-ELSE 程式碼 判斷某些布林運算式的真假值,以決定後續要執行的指令的記憶體位置 (也就是程式計數器) Ch07 低階程式語言
9
Pep/7 的重要特徵 409510 Ch07 低階程式語言
10
指令格式 一個指令可以分成兩個部分:8位元的指令指標 (instruction specifier) 及16位元的運算元指標 (operand specifier) (不一定要有)。 Ch07 低階程式語言
11
指令格式 運算碼 (operation code) 是5個位元長度 (以灰色底表示)。運算碼中的位元串指定將要執行何種指令。當我們說Pep/7有32種指令時,你應該可以想到指令運算碼需要5個位元,因為5個位元可產生32種個別的碼,範例在第 12 張投影片。 佔 1 個位元的暫存器指標 (register specifier) 在本書範例固定是存放 0,因為我們只用到暫存器A (累加器)。如需用到其他暫存器,才會存放 1。 佔 2 個位元的定址模式指標 (addressing-mode specifier) (藍綠色底) 指示如何解譯指令的運算元部分,範例說明在第 13 張投影片。 若一個指令不帶有運算元 (要被運算的資料),那就稱為單一位元組指令 (unary instruction),同時不帶有運算元指標,因此只需要 1 個位元組,而不是一般的 3 個位元組。 訂正 Ch07 低階程式語言
12
指令格式 單一位元組(unary)指令 Ch07 低階程式語言
13
指令格式 佔2個位元的定址模式指標指示如何解譯指令的運算元部分,共 4 種,本書僅展示 00 (immediate,組合語言以 i 表示)、01(direct ,組合語言以 d 表示) Ch07 低階程式語言
14
一些指令範例 00000 停止執行 00001 載入運算元 (0007H) 到暫存器 (LOADA 0007, i)
以下為另一個載入指令 (LOADA (001F), d) 08H 0007H 09H 001FH 將記憶體位址 001F 及 0020 的內容載入 A 暫存器 Ch07 低階程式語言
15
指令格式 00010 儲存暫存器到運算元 ( STOREA (000A), d )
將 A 暫存器內容第 1 byte 存到記憶體位址 000A ,第 2 byte存到記憶體位址 000B ( STOREA (000A), d ) 11H 000AH Ch07 低階程式語言
16
指令格式 00011 加上運算元到暫存器裡 (ADDA 20A, i)
如同載入運算一樣,加法運算也同時使用暫存器指標及定址模式指標而產生不同的義涵。 這個指令的第二個及第三個位元組 (運算元指標) 的內容 (十六進制 020A) 被加到A暫存器的內容之中。運算元指標位元使用的底色顯示它們就代表著資料。 例如:如果 A暫存器原本內容為 107AH,此指令執行完畢後,A暫存器內容改為 1284H (ADDA 20A, i) 18H 020AH Ch07 低階程式語言
17
指令格式 ADDA (20A), d 指令的第二個及第三個位元組組成的運算元指標所指定的記憶體位址字語內容 (即020A 及 020B 位址的內容) 被加到A暫存器之中。 00100 減去運算元 這個指令與加法運算相似,只不過運算元是從A暫存器減去而不是加上去。與載入及加法指令一樣,減法指令依定址模式的不同也有不同的變化。 19H 020AH Ch07 低階程式語言
18
指令格式 11011 字元輸入到運算元 CharI (000A)
這個指令允許讓程式在執行時,程式可以由輸入裝置輸入一個ASCII字元。但是這個指令只允許直接定址模式,所以字元是儲存在運算元指標所指定的位址內。 以上的指令代表從輸入裝置讀取一個ASCII字元,並將它儲存在000A位址內。此指令只會影響 1 個位元組而不是 1 個字語。 CharI (000A) D9H 000AH Ch07 低階程式語言
19
指令格式 11100 字元由運算元輸出 CharO h#41,i
這個指令在程式執行時會由輸出裝置送出一個ASCII字元。定址模式可以是立即定址或直接定址模式。 由於指定的是立即定址模式,所以這個指令會將運算元指標所存放的ASCII字元送出去。這個指令的運算元指標放的是 ,也就是十六進制41或是十進制65,這個值代表的ASCII字元就是字母 “A” 所以這個指令將在螢幕上輸出字母A。 CharO h#41,i E0H 0041H Ch07 低階程式語言
20
指令格式 CharO (000A), d 因為是使用直接定址模式,這個指令會將運算元指標所指定的位址內容之ASCII字元送出,也就是將000A位址的內容位元組以ASCII字元輸出。 E1H 000AH Ch07 低階程式語言
21
一個程式的範例:問題及演算法 讓我們先從一個非常簡單的問題開始,假設要在螢幕上寫出 “Hello” 。 Ch07 低階程式語言
22
問題及演算法 在機器語言裡,我們必須將每個字母轉換成它們的ASCII碼表示法。 Ch07 低階程式語言
23
一個程式 (參考 code/pep-p200.odc) 機器碼,當載入器完成工作後,Pep/7的記憶體看起來的樣子。 Ch07 低階程式語言
24
手動模擬 這個程式的執行我們可以依據擷取 / 執行週期的步驟來模擬。這種以手動追蹤執行步驟確實可反映出實際電腦運作時的狀況。
擷取下一個指令 (由程式計數器指定的位址)。 指令解碼 (同時更新程式計數器)。 取得資料 (運算元),如果需要的話。 執行指令。 Ch07 低階程式語言
25
手動模擬 (1) 這個指令被解碼成為使用立即定址模式「將字元寫到輸出」的指令。由於這個指令佔了3個位元組,所以PC暫存器內容要加 3,得到 3。資料是從IR暫存器的運算元指標中取出,然後這個指令就被執行了。結果是 ‘H’ 這個字元被輸出寫在螢幕上。 Ch07 低階程式語言
26
手動模擬 (2) 這個指令一樣被解碼成一個使用立即定址模式「將字元寫到輸出」的指令。由於指令佔了3個位元組,所以PC暫存器內容要再加 3,變為 6。資料被取出後,指令就可以執行, ‘e’ 這個字元就輸出寫在螢幕上。 其餘 ‘l’, ‘l’, ‘o’ 也都以此方式,一一印出 Ch07 低階程式語言
27
手動模擬 (3) 這個運算碼被解碼成「停止」的指令。所以定址模式及運算元指標就被省略掉,整個擷取 / 執行週期就停止了。
Ch07 低階程式語言
28
Pep/7模擬器 雖然Pep/7是一個虛擬 (假想) 的機器,但我們可以用模擬器 (simulator) 來實現它
程式輸出的視窗畫面從螢幕上抓下來的圖: 下拉選單的畫面如下圖所示: Ch07 低階程式語言
29
Pep/7模擬器 假如忘記在 zz 之前隔一個空白字元,那麼載入器將回應以下的錯誤訊息: Ch07 低階程式語言
30
作業練習-1 請利用 Pep/7 列印出 “Hello, 你的英文名字” 例如: “Hello, John Rose” 步驟:
先查 ASCII 表,知道各個字母的碼,再將這些碼一一填入以下 ____ 處: E ___ …… 00 最後將上述機器碼(記得最後面加 zz)輸入到 Pep/7 上執行 Ch07 低階程式語言
Similar presentations