自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用復(fù)古電腦程序 Toy CPU 學(xué)習(xí)低級(jí)編程

系統(tǒng)
我寫(xiě)了一個(gè)名為 “Toy CPU” 的教育性復(fù)古計(jì)算機(jī)程序,以便我的學(xué)生能夠?qū)W習(xí)機(jī)器語(yǔ)言。

我兼職教授大學(xué)課程,包括一個(gè)對(duì)所有專業(yè)開(kāi)放的一般計(jì)算機(jī)主題的課程。這是一門(mén)入門(mén)課程,向?qū)W生講授技術(shù)是如何運(yùn)作的,以消除圍繞計(jì)算的神秘感。

雖然不是計(jì)算機(jī)科學(xué)課程,但這門(mén)課的一個(gè)部分涉及計(jì)算機(jī)編程。我通常用非常抽象的術(shù)語(yǔ)談?wù)摼幊?,所以不?huì)讓聽(tīng)眾聽(tīng)不懂。但是今年,我想讓我的學(xué)生以 “老派” 的方式做一些需要 “動(dòng)手” 的編程。同時(shí),我又想保持簡(jiǎn)單,以便讓每個(gè)人都能跟上。

我喜歡將我的課程結(jié)構(gòu)化,以顯示你是如何從 “那里” 到 “這里” 的。理想情況下,我會(huì)讓我的學(xué)生學(xué)習(xí)如何編寫(xiě)一個(gè)簡(jiǎn)單的程序。然后,我將從這里開(kāi)始,展示現(xiàn)代編程是如何讓開(kāi)發(fā)人員創(chuàng)建更復(fù)雜的程序的。我決定嘗試一種非常規(guī)的方法 —— 教學(xué)生學(xué)習(xí)終極的低級(jí)別編程語(yǔ)言:機(jī)器語(yǔ)言。

機(jī)器語(yǔ)言編程

早期的個(gè)人電腦如 Apple II(1977 年)、TRS-80(1977 年)和 IBM PC(1981 年)讓用戶用鍵盤(pán)輸入程序,并在屏幕上顯示結(jié)果。但計(jì)算機(jī)并不總是帶有屏幕和鍵盤(pán)。

Altair 8800 和 IMSAI 8080(均為 1975 年制造)要求用戶使用面板上的 “開(kāi)關(guān)和燈” 輸入程序。你可以用機(jī)器語(yǔ)言輸入指令,使用一組開(kāi)關(guān),機(jī)器會(huì)點(diǎn)亮 LED 燈以代表每個(gè)二進(jìn)制指令的 1 和 0。

Altair 8800 計(jì)算機(jī)的圖片

Altair 8800 計(jì)算機(jī)的圖片

對(duì)這些早期機(jī)器進(jìn)行編程,需要了解被稱為 “操作碼opcode” (操作代碼的簡(jiǎn)稱)的機(jī)器語(yǔ)言指令,以執(zhí)行基本操作,如將兩個(gè)數(shù)字相加或?qū)⒁粋€(gè)值存儲(chǔ)到計(jì)算機(jī)的存儲(chǔ)器中。我想向我的學(xué)生展示程序員是如何通過(guò)開(kāi)關(guān)和燈,手工輸入一系列指令和內(nèi)存地址的。

然而,在這門(mén)課上,使用實(shí)際的 Altair 8800 就有點(diǎn)太復(fù)雜了。我需要一些簡(jiǎn)單的、任何初級(jí)水平的學(xué)生都能掌握的東西。理想情況下,我希望能找到一個(gè)簡(jiǎn)單的 “業(yè)余” 復(fù)古計(jì)算機(jī),其工作原理與 Altair 8800 相似,但我無(wú)法找到一個(gè)價(jià)格低于 100 美元的合適的 “類似 Altair” 的設(shè)備。我找到了幾個(gè) “Altair” 軟件模擬器,但它們忠實(shí)地再現(xiàn)了 Altair 8800 的操作碼,這對(duì)我的需求來(lái)說(shuō)太過(guò)沉重。

我決定編寫(xiě)我自己的 “教育” 復(fù)古計(jì)算機(jī)。我稱它為 “Toy CPU”。你可以在我的 ??GitHub 代碼庫(kù)?? 上找到它,包括幾個(gè)可以運(yùn)行的版本。第一版是一個(gè)實(shí)驗(yàn)性的原型,運(yùn)行在 ??FreeDOS?? 上。第二版是一個(gè)更新的原型,在 Linux 上用 ??ncurses?? 運(yùn)行。版本 3 是一個(gè) FreeDOS 程序,在圖形模式下運(yùn)行。

Toy CPU 的編程

Toy CPU 是一個(gè)非常簡(jiǎn)單的復(fù)古計(jì)算機(jī)。它只有 256 字節(jié)的內(nèi)存和一個(gè)最小化的指令集,其目的是在復(fù)制 “開(kāi)關(guān)和燈” 編程模式的同時(shí)保持簡(jiǎn)單化。它的界面模仿 Altair 8800,有一系列 8 個(gè) LED 燈,分別代表計(jì)數(shù)器(程序的 “行號(hào)”)、指令、累積器(用于臨時(shí)數(shù)據(jù)的內(nèi)部存儲(chǔ)器)和狀態(tài)。

當(dāng)你啟動(dòng) Toy CPU 時(shí),它通過(guò)清除內(nèi)存來(lái)模擬 “啟動(dòng)”。當(dāng)它啟動(dòng)時(shí),它也會(huì)在屏幕右下方的狀態(tài)燈中顯示 “INI”(初始化)?!癙WR”(電源)燈亮表示 Toy CPU 已被打開(kāi)。

Toy CPU 的啟動(dòng)屏幕

Toy CPU 的啟動(dòng)屏幕

當(dāng) Toy CPU 準(zhǔn)備好讓你進(jìn)入一個(gè)程序時(shí),它通過(guò)狀態(tài)燈指示 “INP”(“輸入”模式),并讓你從程序的計(jì)數(shù)器 0 開(kāi)始。Toy CPU 的程序總是從計(jì)數(shù)器 0 開(kāi)始。

在 “輸入” 模式下,用上下方向鍵顯示不同的程序計(jì)數(shù)器,按回車(chē)鍵編輯當(dāng)前計(jì)數(shù)器上的指令。當(dāng)你進(jìn)入 “編輯” 模式時(shí),Toy CPU 的狀態(tài)燈上會(huì)顯示 “EDT”(“編輯” 模式)。

Toy CPU 編輯屏幕

Toy CPU 編輯屏幕

Toy CPU 有一張速查表,被 “貼” 在顯示屏的前面。它列出了 Toy CPU 可以處理的不同操作碼。

  • ??00000000??(??STOP??):停止程序執(zhí)行。
  • ??00000001??(??RIGHT??):將累加器中的位向右移動(dòng)一個(gè)位置。值??00000010?? 變成??00000001??,??00000001?? 變成??00000000??。
  • ??00000010??(??LEFT??):將累加器中的位向左移動(dòng)一個(gè)位置。值??01000000?? 變成??10000000??,??10000000?? 變成??00000000??。
  • ??00001111??(??NOT??):對(duì)累加器進(jìn)行二進(jìn)制非操作。例如,值??10001000?? 變成??01110111??。
  • ??00010001??(??AND??):對(duì)累加器用存儲(chǔ)在某一地址的值進(jìn)行二進(jìn)制與操作。該地址被存儲(chǔ)在下一個(gè)計(jì)數(shù)器中。
  • ??00010010??(??OR??):對(duì)累積器用存儲(chǔ)在某一地址的值進(jìn)行二進(jìn)制或運(yùn)算。
  • ??00010011??(??XOR??):對(duì)累加器用存儲(chǔ)在某一地址的值進(jìn)行二進(jìn)制異或運(yùn)算。
  • ??00010100??(??LOAD??):將一個(gè)地址的值加載(復(fù)制)到累加器中。
  • ??00010101??(??STORE??): 存儲(chǔ)(復(fù)制)累加器中的值到一個(gè)地址。
  • ??00010110??(??ADD??):將存儲(chǔ)在某一地址的數(shù)值加入到累加器中。
  • ??00010111??(??SUB??):從累積器中減去儲(chǔ)存在某一地址的數(shù)值。
  • ??00011000??(??GOTO??):轉(zhuǎn)到(跳到)一個(gè)計(jì)數(shù)器地址。
  • ??00011001??(??IFZERO??):如果累加器為零,轉(zhuǎn)到(跳到)一個(gè)計(jì)數(shù)器地址。
  • ??10000000??(??NOP??):空操作,可以安全地忽略。

當(dāng)處于 “編輯” 模式時(shí),使用左右方向鍵選擇操作碼中的一個(gè)位,然后按空格鍵在關(guān)閉(0)和開(kāi)啟(1)之間翻轉(zhuǎn)數(shù)值。當(dāng)你完成編輯后,按回車(chē)鍵回到 “輸入” 模式。

Toy CPU 輸入模式屏幕

Toy CPU 輸入模式屏幕

一個(gè)示例程序

我想通過(guò)輸入一個(gè)簡(jiǎn)短的程序來(lái)探索 Toy CPU,將兩個(gè)數(shù)值相加,并將結(jié)果存儲(chǔ)在 Toy CPU 的內(nèi)存中。實(shí)際上,這執(zhí)行的是算術(shù)運(yùn)算 ??A+B=C??。要?jiǎng)?chuàng)建這個(gè)程序,你只需要幾個(gè)操作碼:

  • ??00010100??(??LOAD??)
  • ??00010110??(??ADD??)
  • ??00010101??(??STORE??)
  • ??00000000??(??STOP??)

??LOAD??、??ADD?? 和 ??STORE?? 指令需要一個(gè)內(nèi)存地址,這個(gè)地址總是在下一個(gè)計(jì)數(shù)器的位置。例如,程序的前兩條指令是:

    計(jì)數(shù)器 0:00010100
計(jì)數(shù)器 1:某個(gè)內(nèi)存地址,第一個(gè)值 A 存放在那里

計(jì)數(shù)器 0 中的指令是 ??LOAD?? 操作,計(jì)數(shù)器 1 中的值是你存儲(chǔ)某個(gè)值的內(nèi)存地址。這兩條指令一起將內(nèi)存中的數(shù)值復(fù)制到 Toy CPU 的累加器中,在那里你可以對(duì)該數(shù)值進(jìn)行操作。

將一個(gè)數(shù)字 ??A?? 裝入累加器后,你需要將數(shù)值 ??B?? 加到它上面。你可以用這兩條指令來(lái)做:

    計(jì)數(shù)器 2:00010110
計(jì)數(shù)器 3:存儲(chǔ)第二個(gè)值 B 的內(nèi)存地址

假設(shè)你把值 ??1??(??A??)裝入累加器,然后把值 ??3??(??B??)加到它上面?,F(xiàn)在累加器的值是 ??4???,F(xiàn)在你需要用這兩條指令把數(shù)值 ??4?? 復(fù)制到另一個(gè)內(nèi)存地址(??C??):

    計(jì)數(shù)器 4:00010101
計(jì)數(shù)器 5:一個(gè)內(nèi)存地址(C),我們可以在那里保存新的值

把這兩個(gè)值加在一起后,現(xiàn)在可以用這條指令結(jié)束程序:

計(jì)數(shù)器 6: 00000000

計(jì)數(shù)器 6 之后的任何指令都可以供程序作為存儲(chǔ)內(nèi)存使用。這意味著你可以用計(jì)數(shù)器 7 的內(nèi)存來(lái)儲(chǔ)存值 ??A??,計(jì)數(shù)器 8 的內(nèi)存來(lái)儲(chǔ)存值 ??B?? ,計(jì)數(shù)器 9 的內(nèi)存來(lái)儲(chǔ)存值 ??C??。你需要將這些分別輸入到 Toy CPU 中:

    計(jì)數(shù)器 7:00000001(1)
計(jì)數(shù)器 8:00000011(3)
計(jì)數(shù)器 9:00000000(0,以后會(huì)被覆蓋)

在弄清了所有指令和 ??A??、??B?? 和 ??C?? 的內(nèi)存位置后,現(xiàn)在可以將完整的程序輸入到 Toy CPU 中。這個(gè)程序?qū)?shù)值 1 和 3 相加,得到 4:

    計(jì)數(shù)器 0:00010100
計(jì)數(shù)器 1:00000111(7)
計(jì)數(shù)器 2:00010110
計(jì)數(shù)器 3:00001000(8)
計(jì)數(shù)器 4:00010101
計(jì)數(shù)器 5:00001001(9)
計(jì)數(shù)器 6:00000000
計(jì)數(shù)器 7:00000001(1)
計(jì)數(shù)器 8:00000011(3)
計(jì)數(shù)器 9:00000000(0,以后會(huì)被覆蓋)

要運(yùn)行程序,在 “輸入” 模式下按下 ??R?? 鍵。Toy CPU 將在狀態(tài)燈中顯示 “RUN”(“運(yùn)行” 模式),并從計(jì)數(shù)器 0 開(kāi)始執(zhí)行你的程序。

Toy CPU 有一個(gè)明顯的延遲,所以你可以看到它執(zhí)行程序中的每一步。隨著程序的進(jìn)行,你應(yīng)該看到計(jì)數(shù)器從 ??00000000??(0)移動(dòng)到 ??00000110??(6)。在計(jì)數(shù)器 1 之后,程序從內(nèi)存位置 7 加載數(shù)值 ??1??,累積器更新為 ??00000001??(1)。在計(jì)數(shù)器 3 之后,程序?qū)⒓訑?shù)值 ??3??,并更新累加器顯示 ??00000100??(4)。累加器將保持這種狀態(tài),直到程序在計(jì)數(shù)器 5 之后將數(shù)值存入內(nèi)存位置 9,然后在計(jì)數(shù)器 6 結(jié)束。

在運(yùn)行模式下的 Toy CPU

在運(yùn)行模式下的 Toy CPU

探索機(jī)器語(yǔ)言編程

你可以使用 Toy CPU 來(lái)創(chuàng)建其他程序,并進(jìn)一步探索機(jī)器語(yǔ)言編程。通過(guò)用機(jī)器語(yǔ)言編寫(xiě)這些程序來(lái)測(cè)試你的創(chuàng)造力。

一個(gè)在累積器上閃燈的程序

你能點(diǎn)亮累加器上的右四位,然后是左四位,然后是所有的位嗎?你可以用兩種方法之一來(lái)寫(xiě)這個(gè)程序。

一種直接的方法是,從不同的內(nèi)存地址加載三個(gè)數(shù)值,像這樣:

    計(jì)數(shù)器 0:LOAD
計(jì)數(shù)器 1:“右邊”
計(jì)數(shù)器 2:LOAD
計(jì)數(shù)器 3:“左邊”
計(jì)數(shù)器 4:LOAD
計(jì)數(shù)器 5:“所有”
計(jì)數(shù)器 6:STOP
計(jì)數(shù)器 7:00001111(“右邊”)
計(jì)數(shù)器 8:11110000(“左邊”)
計(jì)數(shù)器 9:11111111(“全部”)

寫(xiě)這個(gè)程序的另一種方法是嘗試使用 ??NOT??? 和 ??OR?? 二進(jìn)制操作。這樣可以得到一個(gè)更小的程序:

    計(jì)數(shù)器 0:LOAD
計(jì)數(shù)器 1:“右邊”
計(jì)數(shù)器 2:NOT
計(jì)數(shù)器 3:OR
計(jì)數(shù)器 4:“右邊”
計(jì)數(shù)器 5:STOP
計(jì)數(shù)器 6:00001111(“右邊”)

從一個(gè)數(shù)字開(kāi)始倒數(shù)

你可以把 Toy CPU 作為一個(gè)倒數(shù)計(jì)時(shí)器。這個(gè)程序行使 ??IFZERO?? 測(cè)試,只有當(dāng)累加器為零時(shí),程序才會(huì)跳轉(zhuǎn)到一個(gè)新的計(jì)數(shù)器:

    計(jì)數(shù)器 0:LOAD
計(jì)數(shù)器 1:“初始值”
計(jì)數(shù)器 2:IFZERO(這也是倒計(jì)時(shí)的“開(kāi)始”)
計(jì)數(shù)器 3:“結(jié)束”
計(jì)數(shù)器 4:SUB
計(jì)數(shù)器 5:“1”
計(jì)數(shù)器 6:GOTO
計(jì)數(shù)器 7:“開(kāi)始”
計(jì)數(shù)器 8:STOP
計(jì)數(shù)器 9:00000111(“初始值”)
計(jì)數(shù)器 10:00000001(“1”)

Toy CPU 是學(xué)習(xí)機(jī)器語(yǔ)言的一個(gè)好方法。我在入門(mén)課程中使用了 Toy CPU,學(xué)生們說(shuō)他們發(fā)現(xiàn)寫(xiě)第一個(gè)程序很困難,但寫(xiě)下一個(gè)程序就容易多了。學(xué)生們還表示,用這種方式編寫(xiě)程序其實(shí)很有趣,他們學(xué)到了很多關(guān)于計(jì)算機(jī)實(shí)際工作的知識(shí)。Toy CPU 既具有教育性,也很有趣味性!

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2018-03-15 22:32:47

谷歌CPU深度學(xué)習(xí)

2023-11-22 16:10:59

編程語(yǔ)言機(jī)器語(yǔ)言

2014-03-07 11:32:18

2012-01-17 13:33:09

一體機(jī)評(píng)測(cè)

2011-06-16 11:35:27

一體機(jī)評(píng)測(cè)

2022-03-24 14:42:19

Python編程語(yǔ)言

2018-07-06 15:25:50

程序員編程python

2021-05-28 09:51:32

開(kāi)源技術(shù) 工具

2010-06-04 17:48:20

Linux編程工具

2010-01-12 17:55:03

C++程序

2021-04-15 08:55:51

Go struc代碼

2023-03-28 16:25:23

ChatGPT

2013-08-23 11:06:34

編程語(yǔ)言

2019-01-15 15:04:54

CPU電腦使用率

2012-07-05 10:24:56

Windows 8Logo

2018-03-15 10:21:50

程序員面試低級(jí)錯(cuò)誤

2018-09-29 16:10:02

編程語(yǔ)言Java程序員

2018-12-14 08:29:56

CPU編程x86

2020-10-13 14:42:42

深度學(xué)習(xí)Windows人工智能

2022-03-29 12:40:35

Linux樹(shù)莓派
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)