目錄
1. User Interface
'Code' 區塊 :
按鈕 :
(1) 'Run' : 按下即開始執行程式,執行中的程式無法修改。
(2) 'Pause' : 按下按鈕,執行中的程式將會暫停,此時可以修改程式;若要繼續執行,
按'Run'。
(3) 'Reset' : 重置按鈕,按下即重置CPU內暫存器、Memory、及Output,Input則重
置成上一次按下'Run'按鈕的狀態。
程式輸入區 : 使用者編輯程式的區域。
'CPU' 區塊 :
'SPEED' : 選擇程式執行速度,1x 速度以下會有動畫,以上則無。
按鈕 :
'Clear' : 重置暫存器至初始值。
暫存器 :
(1) 'PC' : Program Counter,永遠指向下一個將要執行的指令的位址。
(2) 'SW' : Status Word,存放指令'CMP'的比較結果。
(3) 'A' : 一般暫存器,無特殊用途。
(4) 'B' : 一般暫存器,無特殊用途。
(5) 'C' : 一般暫存器,無特殊用途。
(6) 'D' : 一般暫存器,無特殊用途。
'Memory' 區塊 :
三列,每列有10格,共30格,編號從0開始至29結束;可以直接輸入memory給值。
按鈕 :
'Clear' : 清除'Memory'內所有值。
'Input' 區塊 :
每個輸入的數值以空格相間,須在程式開始執行前輸入。
按鈕 :
'Clear' : 清除'Input'區塊。
'Output' 區塊 :
每個輸出數值以空格相間。
按鈕 :
'Clear' : 清除'Output'區塊。
2. Program
編輯主程式必須從行號0開始,主程式內部不能有空白行,否則在程式執行中,抓取到空白行會被
判定錯誤;主程式必須以'end'結尾,告訴電腦程式已經結束。
主程式中,可運用指令,跳到副程式執行再返回主程式繼續執行;主程式與副程式間可以以空白行
隔開做區隔,只要不執行到空白行即可。
0 - .
1 | .
2 | .
Main 3 | .
4 | .
5 | .
6 - end
7
8 - .
9 | .
10 | .
Subr 11 | .
outi 12 | .
ne 13 | .
14 - .
3. Instruction Set
Arithmetic :
(1) ADD
Format :
- add register1 register2
ex : add a b
-> a <= (a) + (b)
- add register number
ex : add c 23
-> c <= (c) + 23
(2) SUB
Format :
- add register1 register2
ex : sub d b
-> d <= (d) - (b)
- add register number
ex : sub a 11
-> a <= (a) - 11
(3) MUL
Format :
- mul register1 register2
ex : mul c b
-> c <= (c) x (b)
- mul register number
ex : mul b 2
-> b <= (b) x 23
(4) DIV
Format :
- div register1 register2
ex : div a c
-> a <= (a) / (c)
- div register number
ex : div d 9
-> d <= (d) / 23
I/O :
(1) IN
Format :
- in register
ex : in b
-> b <= (one value of input stream)
(2) OUT
Format :
- out register
ex : out a
-> output stream <= (a)
Memory Access :
(1) ST
Format :
- st memory_number register
ex : st 12 a
-> mem(12) <= (a)
- st memory_number number
ex : st 3 51
-> mem(3) <= 51
- st memory_number(register) register
ex : st 7(b) c
-> mem(7+(b)) <= (c)
- st memory_number(register) number
ex : st 5(d) 19
-> mem(5+(d)) <= 19
(2) LD
Format :
- ld register memory_number
ex : ld c 28
-> c <= (mem(28))
- ld register memory_number(register)
ex : ld a 13(c)
-> a <= (mem(13+(c)))
Condition & Jump :
(1) CMP
Format :
- cmp register1 register2
ex : cmp a b
-> sw <= (a) ? (b)
- cmp register number
ex : cmp c 90
-> sw <= (c) ? 90
- cmp number register
ex : cmp 54 a
-> sw <= 54 ? (a)
- cmp number1 number2
ex : cmp 23 17
-> sw <= 23 ? 17
(2) JMP
Format :
- jmp line_number
ex : jmp 19
-> PC <= 19
(3) JLT
Format :
- jlt line_number
ex : jlt 21
-> if ((sw) == '<'), PC <= 21
(4) JEQ
Format :
- jeq line_number
ex : jeq 15
-> if ((sw) == '='), PC <= 15
(5) JGT
Format :
- jgt line_number
ex : jgt 17
-> if ((sw) == '>'), PC <= 17
(6) BCK
Format :
- bck
-> return to the last jump instruction
Others :
(1) MOV
Format :
- mov register1 register2
ex : mov b a
-> b <= (a)
- mov register number
ex : mov c 10
-> c <= 10
4. Sample Code
(1) 讀入 n 個數字,輸出各個數字的平方 :
0 in d 將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
1 in a -
2 mul a a | 迴圈,以暫存器B儲存的數值表示目前輸入了多少data,判斷是否繼
3 out a | 續輸入data,如果暫存器B的值小於暫存器D的值,代表輸入尚未結
4 add b 1 | 束,則跳回行號1的地方繼續輸入,反之則程式結束。輸出暫存器A的
5 cmp b d | 值的平方。
6 jlt 1 -
7 end
範例輸入 : 6 1 2 3 4 5 6
//第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。
範例輸出 : 1 4 9 16 25 36
(2) 讀入 n 個數字,輸出前後兩數字的平方相加 :
0 in d 將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
1 in c 輸入一個data至暫存器C。
2 in a -
3 st 0 a |
4 mul a a |
5 mul c c | 迴圈,輸入一個data至暫存A,將暫存器A的值存到記憶體0的位置,
6 add c a | 接著將暫存器C的值平方加上暫存器A的值平方,存回暫存器C,然後
7 out c | 輸出暫存器C的值,接著將記憶體0的值,載入至暫存器C,以暫存器
8 ld c 0 | B的值判斷是否輸入結束,如果尚未結束,跳回行號2繼續執行,反之
9 add b 1 | 則程式結束。
10 cmp b d |
11 jlt 2 -
12 end
範例輸入 : 6 1 2 3 4 5 6
//第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。
範例輸出 : 5 13 25 41 61
(3) 讀入 n 個數字,輸出其中最大的數 :
0 in d 將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
1 in a 輸入一個data至暫存器A。
2 add c 1 暫存器C的值加一,表示目前載入幾個data。
3 in b -
4 add c 1 | 迴圈,將所有data,先輸入至暫存器B,比較暫存器A和B的值,如
5 cmp a b | 果暫存器B的值較大,則跳至行號12的地方,將暫存器B的值存到暫
6 jlt 12 | 存器A的值,反之則比較暫存器C和D的值檢查是否所有data都被載
7 cmp c d | 入過,若還沒則跳回行號3繼續執行。
8 jlt 3 -
9 out a 將結果輸出。
10 end
11
12 mov a b 將暫存器B的值存到暫存器A的值。
13 bck
範例輸入 : 7 21 32 99 124 6 9090 0
//第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。
範例輸出 : 9090
(4) 讀入 n 個數字,將數字排序後輸出 :
0 in d 將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
1 st 29 d 將暫存器D的值存至記憶體29的位置。
2 in a -
3 st 0(b) a | 迴圈,將所有data,先輸入至暫存器A,接著從記憶體0的位置,將暫
4 add b 1 | 存器A的值存入。
5 cmp b d |
6 jlt 2 -
7 mov b 0 初始化暫存器B的值為0
8 ld a 0(b) 將記憶體0的值載入至暫存器A
9 add b 1 暫存器B的值加一,表示目前載入多少data
10 ld c 0(b) -
11 cmp a c |
12 jlt 23 |
13 sub b 1 | 迴圈,載入data至暫存器C,比較暫存器A和C的值,如果暫存器C的
14 st 0(b) c | 值較大,則跳至行號23的地方,將暫存器C的值存到暫存器A,反之則
15 add b 1 | 將兩data在記憶體的位置互換,較大的數值往右排序,位置交換完畢再
16 st 10(b) a | 跳回行號10繼續載入下一個data作比較。
17 add b 1 |
18 cmp b d |
19 jeq 29 |
20 jmp 10 -
21 end
22
23 mov a c -
24 add b 1 | 副程式,將暫存器C的值存到暫存器A的值,暫存器B加一,
25 cmp b d | 判斷是否載入結束,是則跳至行號29繼續執行程式,否則跳回
26 jeq 29 | 行號10繼續執行程式。
27 jmp 10 -
28
29 mov b 0 -
30 sub d 1 | 副程式,初始化暫存器B的值為0,將暫存器D的值減一,表示
31 cmp d 1 | 結束第一輪排序(最大的數值排在最右邊),接著排序剩下的數
32 jeq 35 | 字,如果暫存器D值為一,表示剩下一個數字排序,則不需要排
33 jmp 8 - 序,跳至行號35繼續執行程式,否則跳至行號8繼續執行程式。
34
35 mov b 0 -
36 ld d 29 |
37 ld 0(b) a | 副程式,輸出排序後的結果,從記憶體0位置開始,將data載入
38 add b 1 | 至暫存器A,接著輸出A,直到所有data都輸出完畢,則結束跳
39 out a | 至行號21處結束程式。
40 cmp b d |
41 jlt 36 |
42 jmp 21 -
範例輸入 : 5 20 3 9999 67 773
//第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。
範例輸出 : 3 20 67 773 9999