iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
0
自我挑戰組

計算機概論X30天系列 第 13

Day13:[計算機概論]Toy Machine:用組合語言寫加法

  • 分享至 

  • xImage
  •  

閱讀前,建議可以參考Day1:閱讀指南&為何選擇這個題目?

▌挑戰簡介

  • 題目:計算機概論X30天

  • 挑戰內容:連續30天紀錄計算機概論、離散數學、演算法、資料結構等課程,還有自己學習程式的心得體悟。

  • 本篇性質:純粹上課內容的紀錄,不會有太嚴謹或是流暢的說明,而且我覺得Toy Machine一點都不重要,因此不需要認真閱讀XD

▌為什麼學Toy Machine

  1. 可以了解一下最簡單的電腦結構是如何
  2. 可能是一輩子唯一一次能寫到組合語言的機會
  3. 如果是要寫網頁其實沒啥幫助

▌什麼是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
    • 每個記憶體16bit,也就是1個words
  • 16個暫存器(Register),暫存器編號從0~F
    • 每個暫存器16bit,也就是1個words
  • 1個Program counter
    • 一個8bit的Register
  • 1個ALU
  • Input/Output

▌Toy Machine的指令單元是word

Toy Machine的基本指令,包括暫停、加、減.....,總共就16個
(也就是該電腦可以做16件事情)

https://ithelp.ithome.com.tw/upload/images/20181024/20112011yyyAwlipO2.png

https://ithelp.ithome.com.tw/upload/images/20181024/20112011HlclSkAYuy.png

  1. 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
  1. 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
  • 我覺得如果只是要學寫程式,完全不認識組合語言也沒關係啦(畢竟高階語言的作用就是讓人類不用在寫組合語言嘛!)

上一篇
Day12:[計算機概論]負數怎麼在電腦中儲存?
下一篇
Day 14:[離散數學]同餘(Mod)是什麼?
系列文
計算機概論X30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言