CS-計概06:低階程式語言與虛擬碼

這一個系列是有關「計算機概論」的,主要是我讀書過程中的隨筆。

LuSkywalker
4 min readFeb 7, 2018

6.1 電腦的動作

即可程式化 programmable、儲存 store、擷取 retrieve 及運算 process。

6.2 機器語言

機器語言是電腦唯一能執行的指令,由二進制的數字組成。

❖Pep/8 虛擬電腦

依據不同的CPU會有不同的機器語言,而Pep/8為一台假想的電腦,具有真實電腦應有的特徵,及39個機器語言指令。

▪︎ 記憶單元:由65536個位元組的記憶體組成。
▪︎ 字語長度:2個位元組,也就是16位元。
▪︎ CPU 內有7個暫存器,以下會討論到三個:

  1. PC 程式計數器:存放下一個被執行的指令位址。
  2. IR 程式暫存器:儲存目前執行的指令。
  3. 累加器(A暫存器)。

一個位元組能表示的最大數為255(base 10),也就是11111111(base 2)、0xFF,一個字語(16位元)能表示的最大數為65535,也就是0xFFFF,若要表示負數,則範圍為0x-7FFF~0x7FFF

指令格式 有兩個部分:

  1. 8bits 的指令指標 instruction specifier:表示要執行何種運算,及指標需如何解讀。
  2. 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(直接)表示。

example

❖組譯器指揮動作

.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) …

--

--