CS-計概06:低階程式語言與虛擬碼
這一個系列是有關「計算機概論」的,主要是我讀書過程中的隨筆。
6.1 電腦的動作
即可程式化 programmable、儲存 store、擷取 retrieve 及運算 process。
6.2 機器語言
機器語言是電腦唯一能執行的指令,由二進制的數字組成。
❖Pep/8 虛擬電腦
依據不同的CPU會有不同的機器語言,而Pep/8為一台假想的電腦,具有真實電腦應有的特徵,及39個機器語言指令。
▪︎ 記憶單元:由65536個位元組的記憶體組成。
▪︎ 字語長度:2個位元組,也就是16位元。
▪︎ CPU 內有7個暫存器,以下會討論到三個:
- PC 程式計數器:存放下一個被執行的指令位址。
- IR 程式暫存器:儲存目前執行的指令。
- 累加器(A暫存器)。
一個位元組能表示的最大數為255(base 10),也就是11111111(base 2)、0xFF,一個字語(16位元)能表示的最大數為65535,也就是0xFFFF,若要表示負數,則範圍為0x-7FFF~0x7FFF
❖指令格式 有兩個部分:
- 8bits 的指令指標 instruction specifier:表示要執行何種運算,及指標需如何解讀。
- 16bits 的運算元指標 operand specifier(非必要):存放運算元本身或運算元地址。
▪︎ 指令指標格式
運算碼 operation codes (opcodes) 有4~8個位元長度,我們討論4或是5個bit的,其中 4bits 的第五個 bit 用來表示使用哪個暫存器,暫存器指標為0代表使用A暫存器。
定址模式指標佔 3bits,如果為000代表為立即定址,代表運算元指標即運算元本身;001為直接定址,代表運算元指標為記憶體位址;還有兩種定址模式不討論。
❖opcodes 範例
▪︎ 0000 停止執行:程式暫停,後面三個位元組忽略。
▪︎ 1100 載入運算元至A暫存器:如
1100 0000
0000 0000 0000 0111 → 將 0x7 存入暫存器中。
1110 0001
0000 0000 0001 1111 → 將記憶體位置的 0x001F 的值存入暫存器。
▪︎ 1110 儲存A暫存器到運算元:如
1110 0001
0000 0000 0000 0111 → 將暫存器的值存入 0x0007
注意這裡不可使用立即定址。
▪︎ 0111 加上運算元到A暫存器:如
0111 0000
0000 0001 0010 1111 → 將 0x012F 的值加至暫存器上。
0111 0001
0000 0100 0110 0001 → 將記憶體位置 0x0461的值加至暫存器上。
▪︎ 1000 減去運算元。
▪︎ 01001 字元輸入到運算元:只允許直接定址,如
01001 001
0000 0000 0000 1010 → 從輸入裝置讀取一個ACSII字元,存至0x000A中。
▪︎ 01010 由運算元輸出字元:如
01010 000
0000 0000 0100 0001 → 輸出 ‘A’。
01010 001
0000 0000 0000 1010 → 以ASCII字元輸出0x000A的值。
6.4 組合語言
以指定的字母來助憶機器語言,由組譯器負責翻譯。
❖Pep/8 組合語言
運算碼由0x和四位16進位值組成,定址模式由i(立即)或d(直接)表示。
❖組譯器指揮動作
.ASCII+”STR/x00":表示一組字串。
.BLOCK+位元組數目:產生一個空間。
.WORD+值:指派一個值給字語。
.END:結束。
❖分歧指令
BRLT,若小於則跳至分歧。
BREQ,若等於則跳至分歧。
6.5 演算法表示
❖虛擬碼 pseudocode 功能
▪︎ 變數:出現的名稱,需反應其角色。
▪︎ 指定:變數需要放值,如 Set sum to 0,或是 sum ← 0。
也可以用 Set sum to sum + num,或是 sum ← sum + num。
▪︎ 輸入/輸出
Write “Hello word!”
Read num
▪︎ 選擇
IF(sum<0)…
ELSE …
▪︎ 重複
WHILE(counter < limit) …