閱讀前,建議可以參考Day1:閱讀指南&為何選擇這個題目?
▌挑戰簡介
▌為什麼學Toy Machine
- 可以了解一下最簡單的電腦結構是如何
- 可能是一輩子唯一一次能寫到組合語言的機會
- 如果是要寫網頁其實沒啥幫助
▌什麼是Toy Machine
- 類似於50-60年前的電腦型態
- 現在的電腦幾乎沒有人可以獨自一個人完成
- 但在50-60年前一個人完全有能力獨自做出一個電腦
- 世界上任何電腦可以運算的東西,Toy machine都可以辦到(但是toy machine記憶體和速度有限)
- PDP-8是世界上第一個成功商業化的電腦
- Toy Machine是傳統的馮諾伊曼結構(Von-Neuman Architecture)
- 也就是Stored-program computer(把程式和資料都放在記憶體裡面)
▌Toy Machine的結構
- 256個記憶體(Memory),記憶體編號從00~FF
- 16個暫存器(Register),暫存器編號從0~F
- 1個Program counter
- 1個ALU
- Input/Output
▌Toy Machine的指令單元是word
Toy Machine的基本指令,包括暫停、加、減.....,總共就16個
(也就是該電腦可以做16件事情)
- Format1:OPCODE(前四位元)+dest d(中間四位元)+ sorce s(中間四位元)+ sorce t(後四位元)
- OPCODE:表示要做的動作
- dest d:表示要把資料放到d暫存器
- sorce s:表示從s暫存器拿資料
- sorce t:表示從t暫存器拿資料
- 比如說1223(十六進位表示法)
- 第一個1表示
加法
- 第二個表示暫存器2
- 第二個表示暫存器2
- 第三個表示暫存器3
- 因此1223表示:把暫存器2和3的數字相加後放回暫存器2
- Format2:OPCODE(前四位元)+dest d(中間四位元)+ addr(後面八位元)
- OPCODE:表示要做的動作
- dest d:表示要把資料放到d暫存器
- addr:表示從記憶體拿出資料
- 比如說823E(十六進位表示法)
- 第一個8表示
讀取
- 第二個2表示暫存器2
- 第二、三個3E,表示記憶體3E
- 因此823E表示:把記憶體3E的資料讀到暫存器2
▌用組合語言寫「加法」
前面說過 Toy Machine可以做任何其他電腦可以做的計算,因此現在來做加法
如何做a+b呢?(假設a=4,b=3)
以下是java寫法
int a=4
int b=3
int c=0
while(b!=0)
{
c=c+a
b=b-1
}
console.log(c)
現在開始寫,組合語言,邏輯如下
- 首先記憶體有256個(從00~FF),暫存器有16個(0~F),二者都有1個words(4個十六位元)
- 找幾個記憶體裝數字
- 把記憶體移到暫存器
- 開始進行計算
0A 0004 //把4放在記憶體0A
0B 0003 //把3放在記憶體0B
0C 0000 //把0放在記憶體0C
0D 0001 //把1放在記憶體0D
10 8A0A //把0A的數字4抓到暫存器A
11 8B0B //把0B的數字3抓到暫存器B
12 8C0C //把0C的數字0抓到暫存器C
13 8D0D //把0C的數字1抓到暫存器D
14 CB18 //如果暫存器B的數字為零就跳到__
15 1CCA //把暫存器C跟暫存器A的數字4相加,然後放回C
16 2BBD //把暫存器B跟暫存器D的數字1相減,然後放回B
17 C014 //檢查暫存器1是否為0,如果是就跳回14行(可是暫存器0一定會是零,因為沒設定過)
18 9CFF //把暫存器C的資料存到記憶體FF(FF會跟output連結一起)
19 0000 //停機
心得
- 加法原本需要19行的內容,但現在只要7行就可以解決了,感謝高階語言的出現lol
- 我覺得如果只是要學寫程式,完全不認識組合語言也沒關係啦(畢竟高階語言的作用就是讓人類不用在寫組合語言嘛!)