目錄
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