330 likes | 470 Views
7.4 程式範例. 在螢幕上寫出“ Hello” 的程式 ( 參考 code/pep-p200.odc). Hello (1/3). PC= 00 0 H CharO h# 48, i. Hello (2/3). PC= 00 3 H CharO h# 65, i. Hello (3/3). PC= 0 0F H STOP. Pep/7 模擬器. 模擬 Pep/7 虛擬機器的行為的程式 要執行一個程式之前,我們必須先以十六進制碼的方式,一個位元組一個位元組地 ( 兩位元組間須以空白分隔 ) 輸入程式. 課本第 200 頁. 機器碼.
E N D
7.4 程式範例 • 在螢幕上寫出“Hello” 的程式 (參考 code/pep-p200.odc)
Hello (1/3) • PC=000H CharOh#48, i
Hello (2/3) • PC=003H CharO h#65, i
Hello (3/3) • PC=00FH STOP
Pep/7模擬器 • 模擬 Pep/7 虛擬機器的行為的程式 • 要執行一個程式之前,我們必須先以十六進制碼的方式,一個位元組一個位元組地(兩位元組間須以空白分隔)輸入程式 課本第 200 頁
機器碼 000 003 006 009 00C 00F
另一種寫法 • 剛剛的程式是採 立即定址 方式輸出字母 • 另一種寫法: 可採直接定址方式 (參考 code/pep-p201.odc) • 指令由 11100000 => 11100001 • 在程式碼後面插入資料 000 10 E1 003 E1 11 006 12 E1 009 13 E1 00C 14 E1 00F 48 65 6C 012 6F 6C
加強版的 Hello 程式 • 輸出增加一個使用者輸入的字母(參考 code/pep-p202.odc) • 設定輸入模式及輸出 記憶體位址 0014 的內容於程式執行時會被重新載入使用者輸入的字母
7.5 組合語言 • 組合語言(Assembly languages):指定助憶的 (mnemonic) 字母編碼(簡稱助憶碼)來代表每一個機器語言指令 • 程式設計師使用這些助憶碼編寫程式而不需再使用二進制位元 • 組譯器(assembler)這個程式就負責讀入每一個助憶符號形式的指令並將它轉譯成其所代表的機器語言
Pep/7組合語言 CHAR 為 CHARACTER(字母)縮寫 DEC 為 DECIMAL (十進制)縮寫
虛擬運算碼 有用的組譯器巨集指令動作(assembler directive),也就是幾個組譯器的指令的縮寫
Hello 程式 • 寫出 “Hello”,在組合語言中必須一次輸出一個字母
Hello程式 (立即定址) (參考 code/pep-p206-1.odc 及 code/pep-p206-2.odc)
Hello程式 (直接定址) (參考 code/pep-p208.odc)
Hello程式 (直接定址+寫出使用者輸入字母) (參考 code/pep-p209.odc)
虛擬碼 標籤:可用來命名變數或標示程式位置
完成的程式 第 212 頁
我們完成的程式 (參考 code/pep-p212.odc)
執行結果 繼續執行同一程式會一直累加,若不想累加之前執行的結果,須清空記憶體
7.6 其他重要議題 • 機器語言有很少的資訊隱藏,僅隱藏以下位元資訊:以二的補數表示負整數 • 組合語言可用虛擬碼 • 來命名一個區塊(BLOCK)或一個字組(WORD), • 或標示程式位置,這樣程式可直接跳到這個位置,這在設計迴圈及 IF-ELSE 程式碼時尤其方便
測試 • 測試計畫:基本上是一件文件,當中指定要執行多少次及使用什麼樣的資料來測試程式,以達到程式的完整測試 • 每一組資料就叫做一個測試個案 (test case) • 測試方法 • 涵蓋碼(code-coverage)的測試方法在設計測試個案時,要確保程式中所有的程式碼都要被執行到,又叫透明盒子測試 (clear-box test) • 涵蓋資料測試 (data-coverage testing)的測試方法在設計測試個案時,要確保所有可能資料範圍的邊界值都涵蓋到,又叫黑盒子測試 (black-box test)
測試(以加總3數字為例) • 3 個值須涵蓋正負數,且需測試加總結果在 2 個 byte 所能表示的最大值 (215 -1)及最小值(-215)都運作正常 • 測試 32767, -1, +1 • 測試 32766, 1, 1 (溢位)
狀態位元相關組合語言碼(補充教材) • COMPA limit, i:比較 A 暫存器內容與 limit 的值 • 當 A 暫存器內容內容 < limit 的值,會設定狀態位元 N 的值為 1 • 當 A 暫存器內容內容 = limit 的值,會設定狀態位元 Z 的值為 1 • BRLT Case2: 當狀態位元 N (表 Negative,負) 的值為 1,則將程式計數器暫存器 (Program Counter ,PC) 設為運算元 Case2 (當 N 為 1 表示 A暫存器的值小於 0) • BREQ Case1:當狀態位元 Z (表 Zero,零) 的值為 1,則將程式計數器暫存器 (Program Counter ,PC) 設為運算元 Case1 (當 Z 為 1 表示 A暫存器的值等於 0) • Example program • code/Pr0701.odc code/Pr0701-2.odc code/Pr0701-3.odc (比大小,IF-ELSE) • code/Pr0702.odc (WHILE)
道德的議題:軟體侵權,版權 • 研究指出,在2000年一年中,全世界損失在盜版軟體上的金額有美金 $115億元 • 開放原始碼的擁護者認為程式的原始碼必須要公開出來 • 對於不是開放程式碼的軟體,從許多角度來看,尊重其軟體版權是非常重要的
勘誤 • 第 202 頁,倒數第 5 列,識別子 英文 為 identifier ,改翻譯為 變數名稱 • 第 212 頁程式碼的圖, num1、num2、num3 應該都是 d#2 (而非 d#1),因此也造成其於記憶體位址 0014、0017、001A、001D 機器碼也都要修改,參考講義第 22 頁 • 第 214 頁,最後一列,最小值應為 -215