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