另一種程式寫法 (補充教材) 課本的程式是採 立即定址 方式輸出字母 另一種寫法: 可採直接定址方式 指令由 11100000 (E0H) => 11100001 (E1H) 在程式碼後面插入資料 (參考 code/pep-p201.odc) 輸出 010H 地址的內容所代表的字元 000 E1 10 003 E1 11 006 E1 12 009 E1 13 010H 地址的內容為 48H 00C E1 14 00F 00 48 65 012 012 6C 6C 6F Ch07 低階程式語言
作業練習-2 請參考前頁,以直接定址方式利用 Pep/7 列印出 “Hello, 你的英文名字” Ch07 低階程式語言
Hello 程式變形 (補充教材) Hello 後增加一個由使用者互動輸入的字元 (參考 code/pep-p202.odc) 000 003 CHARI,輸入的字元儲存到 014H 記憶體位置 006 009 00C 00F D9 00 14 012 012 E0 00 00 這裡是 014H 015 00 Ch07 低階程式語言
7.5 組合語言 組合語言 (assembly language) 指定一些助憶的(mnemonic)字母編碼 (簡稱助憶碼)來代表每一個機器語言指令。 程式設計師使用這些助憶碼編寫程式而不需再使用二進制位元 組譯器 (assembler) 這個程式就負責讀入每一個助憶符號形式的指令,然後轉譯成相對的機器語言形式。 Ch07 低階程式語言
Pep/7組合語言 縮寫:CHAR 為 CHARACTER(字母),DEC 為 DECIMAL (十進制),h 為 hexidecimal , c 為 character,i 為 immediate,d 在 “,” 後為 direct, d 在 “,” 前是 decimal Ch07 低階程式語言
虛擬運算碼 定義:組譯器巨集指揮動作(assembler directive),也就是請組譯器完成的準備動作,以便利組合語言程式的執行,在 Pep7 有 4 個虛擬運算碼 (其中 .WORD 有 2 種運算元表示方式),都是以 ‘.’ 開始: BLOCK:區塊,占用記憶體位元組數目由運算元的值決定 WORD:字語:占用記憶體位元組數目固定為 2 個位元組,適 用於需要給訂初始值時 Ch07 低階程式語言
Hello程式(7-4節)的組合語言版本 (1) (立即定址模式) (參考 code/pep-p206-1.odc 及 code/pep-p206-2.odc ) Ch07 低階程式語言
Hello程式(7-4節)的組合語言版本 (2) (直接定址模式) (參考 code/pep-p208.odc) Ch07 低階程式語言
Hello程式(7-4節)的組合語言版本(3) 執行了Pep/7下拉選單的Assemble選項之後的結果顯示於下面的視窗畫面: Ch07 低階程式語言
Hello程式(7-4節)的組合語言版本(4) 我們也可以點選Pep/7下拉選單下的Assembler Listing選項,以得到組譯器列表如下圖所示。 Ch07 低階程式語言
Hello 程式變形 的組合語言版(補充教材) (參考 code/pep-p209.odc) Ch07 低階程式語言
一個加總程式範例 (1) 需求:請輸入 3 個整數,並計算其加總所得數字, 需要 4 個放整數的記憶體位置給 輸入值及加總結果 num1, num2, num3, sum 將 sum 的記憶體內容先設為 0,載入到 ALU 輸入 num1,再利用 ADDA 將 ALU 內容(0)與 num1 加起來 (ALU 會存有 num1 ) 輸入 num2,再利用 ADDA 將 ALU 內容與 num2 加起來 (ALU 存有 num1 + num2結果) 輸入 num3,再利用 ADDA 將 ALU 內容與 num3 加起來 (ALU 存有三數加總結果) 將 ALU結果以 STOREA 存到 sum的記憶體位置 Ch07 低階程式語言
一個加總程式範例 (2) 虛擬運算碼: 標籤:可用來命名變數或標示程式位置,以變數名稱開頭後加上 ‘:’,如 sum, num1, num2, num3。Main 為所有程式的開始執行位置之標籤 Ch07 低階程式語言
一個加總程式範例 (3) 無條件跳躍 預備動作 開始執行標籤 Ch07 低階程式語言
一個加總程式範例 (4) (參考 code/pep-p212.odc) Ch07 低階程式語言
執行結果 繼續執行同一程式會一直累加,若不想累加之前執行的結果,須以如下方式清空記憶體 內容,再重新 Assemble/Load/Execute Ch07 低階程式語言
作業練習-3 請參考課本的加總程式範例,改寫成只需要 2 個放整數的記憶體位置給輸入值 (num)及加總結果 (sum) 提示:因為本例題的各個輸入值加到加總後就沒有用了,因此,可以讓原程式的 num1, num2, num3 共用一個記憶體位置 num,也就是將原來的 “DECI num1, d” 、 “DECI num2, d”、 “DECI num3, d” 都改為 “DECI num,d” ,記得虛擬運算碼部分也要將 3 個虛擬運算碼改成 1 個 課本習題第 16-20 題 (手寫) 請於 12 月 5 日前將 3 題作業練習的程式碼繳交至教學支援平台 Ch07 低階程式語言
在組合語言中做決策(作判斷)的方法 Branch 及 Compare 的縮寫,EQ 為 Equal,LT 為 Less Than 本例為 008BH 範例: Ch07 低階程式語言
在組合語言中做決策(作判斷)的方法 COMPA limit, d:比較 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 Ch07 低階程式語言
在組合語言中做決策(作判斷)的方法 假設需求改為:當總和sum為正數時就印出sum,如果sum為負值則印出一個錯誤訊息。 上面這個 If 敘述展開成為組合語言的演算法的形式如下: if 敘述,其基本型式(注意縮排)為: if 條件 條件成立時的操作 else 條件不成立時的操作 if 敘述的變形,其基本型式為: if 條件 條件成立時的操作 不管條件成不成立,都進行的操作 Ch07 低階程式語言
在組合語言中做決策的方法範例程式 因為 硬體自動設定 N 及 Z,所以可以直接BRLT Ch07 低階程式語言
一個具有迴圈的程式 迴圈:程式可以反覆執行同一段程式碼若干次 做法:讓 BR (或 BREQ, BRLT, COMPA) 等可以 跳回至前面的標籤 假設需求為:請先輸入要加總的整數的個數(每次執行時才決定,不是事先決定的),再請使用者一個一個輸入這些整數,加總後列印其總和 while 敘述 的類型 (要注意縮排): while condition statement1 statement2 statement3 Ch07 低階程式語言
一個具有迴圈的程式 第一步是預備動作,先宣告我們會使用到的變數:limit, number及sum。 每次進行迴圈時,內部的做法: Ch07 低階程式語言
一個具有迴圈的程式 Ch07 低階程式語言
一個具有迴圈的程式
更多範例程式 (補充教材) 比大小(使用 if 的概念) 迴圈 (while) code/Pr0701.odc :跟 100 比大小,大的話輸出 “high” ,否則輸出 “low” code/Pr0701-2.odc :增加 等於 100 時輸出 “eq” 的檢查 code/Pr0701-3.odc: 較簡潔的寫法 迴圈 (while) code/Pr0702.odc :警車追贓車 Ch07 低階程式語言
因為 limit 為常數,此處才能用 i(立即模式), code/Pr0701.odc 因為 limit 為常數,此處才能用 i(立即模式), Ch07 低階程式語言
code/Pr0701-2.odc Ch07 低階程式語言
code/Pr0701-3.odc Ch07 低階程式語言
code/Pr0702.odc Ch07 低階程式語言
作業: 12/12 交到教學支援平台 請輸入 3 個整數,分別存在 num1, num2, num3 這 3 個變數,請計算出 num1 – num2 + num3 的值,輸出結果。如果 結果為正,輸出 “++”,如果結果為負,輸出 “--”,如果結果為 0,輸出 “0” (註:減法的部分,可用 SUBA 助憶符號) 請輸入一個正整數值 n,計算 1 + 2 + … + n 的總和 說明:可以參考 第 24 頁範例(一個具有迴圈的程式),但本程式在迴圈中不用輸入值,直接加上 limit 的值即可 課本習題第 41, 42 題,找出程式碼的錯誤,並且加以訂正 (第 41 題以文字檔繳交,第 42 題以程式碼繳交) Ch07 低階程式語言
7.6 其他重要的關聯:抽象化與測試 機器語言有很少的資訊隱藏,僅隱藏以下位元資訊:以二的補數表示負整數 組合語言可用抽象化概念隱藏一些細節 用變數來命名一個區塊(BLOCK)或一個字組(WORD) 標示程式位置,這樣程式可直接跳到這個位置,這在設計迴圈及 IF-ELSE 程式碼時尤其方便 一個測試計畫 (test plan)基本上是一件文件,當中指定要執行多少次及使用什麼樣的資料來測試程式以達到程式的完整測試。每一組輸入資料值就叫作一個測試樣本 (test case)。 Ch07 低階程式語言
抽象化與測試 測試過程中有幾種測試方法可以依循 一種稱為涵蓋碼 (code-coverage) 的方法是設計測試樣本時要確保程式中所有的敘述都要被執行到。因為對於測試者而言,程式碼都是看得到的,所以這種方法也被稱作透明盒子測試 (clear-box testing)。 另一種稱為涵蓋資料測試 (data-coverage testing) 的方法是設計測試樣本時要確保所有可能資料範圍都必須涵蓋到。由於這種方法只基於輸入資料本身而不管程式碼,所以也被稱作黑盒子測試 (black-box testing)。 Ch07 低階程式語言
測試計畫的實施 測試計畫的實施 (test-plan implementation) 涵蓋執行測試計畫中所列的每一個測試樣本,並記錄所有的結果。 我們要做加總三個數字的動作,所以設計輸入值時必須確定加總後的和不會超過 ± 215 – 1。 要實現這個測試計畫,程式必須執行六次,逐次測試每一種資料樣本。 Ch07 低階程式語言
測試計畫的實施 Pep/7選單中選擇Execution Input (執行輸入),我們將會見到以下的畫面: Ch07 低階程式語言
測試計畫的實施 我們只要鍵入一個數字並點選Continue鈕。這個畫面會再出現兩次以便我們輸入另外兩個數值。如果我們先輸入第一個數值4,第二個數值6,及第三個數值1,則我們可得到下面的輸出畫面: Ch07 低階程式語言