作為我們討論的起點,讓我們進行一個簡單的思想實驗。假設(shè)我們剛剛完成了4位HRRG計算機的構(gòu)建。我們還假設(shè)它是地球上的第一臺計算機。也就是說,沒有任何其他計算機或編程語言,或者……好吧,什么都沒有。
讓我們寬容自己,并假設(shè)我們還開發(fā)了一些輸入和輸出設(shè)備-看起來像QWERTY鍵盤,VT100終端和紙帶讀/寫器,并且已經(jīng)將它們連接到某些HRRG上。輸入和輸出端口,但我們尚未創(chuàng)建任何代碼來驅(qū)動小流氓。
在繼續(xù)本專欄的其余部分之前,為什么不暫停片刻,以考慮下一步將要做什么。
用機器代碼捕獲和輸入程序
作為一個快速提醒,HRRG具有16個寄存器并支持16條指令,如下所示(“指令集”和“指令”中對各種指令執(zhí)行其魔術(shù)的方式進行了更詳細的討論。權(quán)衡”列)。
HRRG的CPU寄存器和指令。(來源:馬克斯·麥克菲爾德(Max Maxfield)
我們的首要任務(wù)是創(chuàng)建一個非常非常簡單的程序,以確保該野獸完全起作用。如果我們決定使用鉛筆和紙來捕獲該程序的意圖并繪制帶有相關(guān)注釋的流程圖,這不會讓我感到驚訝,如下所示:
一個簡單程序的流程圖。(來源:馬克斯·麥克菲爾德(Max Maxfield)
下一步將是確定要加載到計算機內(nèi)存中的哪些操作碼和操作數(shù),以實現(xiàn)我們的程序。再一次,這可能涉及鉛筆和紙以及一些皺眉和頭撓,結(jié)果如下所示:
簡單程序的機器代碼。(資料來源:馬克斯·麥克菲爾德(Max Maxfield)
這種表示形式稱為“機器代碼”,因為它們是我們的計算機(機器)將執(zhí)行(處理)的二進制代碼。
最后但并非最不重要的一點是,我們希望將機器代碼加載到計算機中并運行程序,但是我們將如何做呢?好吧,我們可能會構(gòu)建一個開關(guān)面板并將其連接到計算機。至少,這將涉及12個撥動開關(guān)代表地址,4個撥動開關(guān)代表數(shù)據(jù),以及幾個控制開關(guān)和按鈕,如下所示。
簡單的HRRG開關(guān)面板(來源:Max Maxfield)
為了輸入程序,我們將“ Program / Run”開關(guān)設(shè)置為“ Program”,在地址開關(guān)上設(shè)置一個地址,并在數(shù)據(jù)開關(guān)上設(shè)置一個相應(yīng)的操作碼或操作數(shù),然后按“ Load”按鈕以將該值加載到內(nèi)存中。我們將對構(gòu)成程序的所有小節(jié)重復此過程。上圖顯示了我們準備將$ C(跳轉(zhuǎn))操作碼輸入到內(nèi)存位置$ 106中。
輸入程序后,我們將地址開關(guān)設(shè)置為指向程序的起始地址(在本示例中為$ 100),然后將“ Program / Run”開關(guān)切換為“ Run”。
用匯編語言捕獲程序
許多設(shè)計原始計算機的團隊都認為,為了獲得最佳結(jié)果,必須盡可能地靠近機器。也就是說,他們的理念是編寫盡可能接近機器內(nèi)部表示形式的程序;即機器代碼。
但是,您可能想像到,以機器代碼捕獲和輸入程序非常耗時,容易出錯,并且最終會給地域帶來麻煩。下一步是使用一種稱為匯編語言的低級符號編程語言來捕獲一個程序,在該語言中,程序的語句與計算機的機器代碼指令之間存在非常強的對應(yīng)關(guān)系。(英國數(shù)學家凱瑟琳·布斯(Kathleen Booth)因她在1947年開始的理論工作而發(fā)明了匯編語言的概念而受到贊譽。)
當然,擁有匯編語言與擁有匯編程序并不相同,匯編程序是指將匯編程序源代碼轉(zhuǎn)換為可執(zhí)行機器代碼的實用程序。在我們的思想實驗中,我們?nèi)蕴幱谑褂勉U筆和紙來捕獲程序的階段。
假設(shè)我們已經(jīng)定義了HRRG匯編語言(我們將在我的下一篇專欄中更詳細地考慮該語言)。在這種情況下,我們可以使用鉛筆和紙以匯編語言捕獲程序并將其手工匯編為機器代碼。讓我們考慮一下原始測試程序的情況,如下所示:
手工匯編代碼(來源:Max Maxfield)
非常有用的一件事是將標簽與關(guān)鍵指令的地址相關(guān)聯(lián),例如標記我們循環(huán)開始的LOOP標簽。在瀏覽程序時,我們將構(gòu)建標簽及其地址的交叉引用表,如上圖的右上角所示。
就我們的簡單程序而言,我們在使用標簽之前先聲明了標簽,這使我們的生活變得輕松。在更復雜的程序中,我們可能在聲明標簽之前先參考標簽(例如,跳轉(zhuǎn)到其標簽位于程序下方的子例程)。在這種情況下,我們將對源代碼執(zhí)行多次遍歷,其中第一遍遍使我們能夠確定所有標簽的地址,而第二遍遍使我們能夠解析我們不知道的任何地址,時間周期。
通過我們的引導程序振作起來
這就是開始變得有趣的地方。首先,我們將創(chuàng)建幾個簡單的低級實用程序例程,以允許我們監(jiān)視鍵盤并使用我們的紙帶讀取器/寫入器。為此,我們可以用鉛筆和紙捕獲源代碼,將其手工組裝成機器代碼,然后使用開關(guān)面板將該機器代碼加載到計算機的內(nèi)存中(請注意,我們可以將多個程序存儲在計算機的不同區(qū)域中)。記憶)。
大約在這個時候,我們還將創(chuàng)建一個低級別的監(jiān)視程序。這種程序提供了一個簡單的用戶界面(通常基于單個字符命令),以允許用戶執(zhí)行諸如檢查和更改內(nèi)存,讀取或?qū)懭隝 / O端口以及將控制權(quán)轉(zhuǎn)移到內(nèi)存中其他程序的操作。再一次,將使用鉛筆和紙捕獲該程序,然后手工組裝,并使用開關(guān)面板將其加載到計算機的內(nèi)存中。
接下來,我們將創(chuàng)建一個簡單的匯編程序,僅支持我們最終希望擁有的部分功能。和以前一樣,將使用鉛筆和紙捕獲此簡單的匯編程序,然后手工組裝,然后使用開關(guān)面板將其加載到計算機的內(nèi)存中。
現(xiàn)在我們可以搖滾了,因為我們可以使用電傳打字機終端之類的功能來捕獲首遍匯編程序支持的匯編語言子集中的程序,并將這些源代碼程序?qū)懭爰垘?。接下來,我們可以使用監(jiān)視程序和實用程序從紙帶讀取此源代碼,并將其存儲在計算機內(nèi)存的一個區(qū)域中。然后,我們可以使用首遍匯編程序?qū)⒋嗽创a匯編為可執(zhí)行的機器代碼,并將其存儲在內(nèi)存的另一個區(qū)域中。在這一點上,我們可以對存儲在計算機內(nèi)存中的可執(zhí)行機器代碼做兩件事:
從這時起,我們的牡蠣(或龍蝦,或我們選擇的任何甲殼類動物)便成為現(xiàn)實,因為我們可以使用首過匯編程序為所有現(xiàn)有程序(包括監(jiān)視器,低級程序)創(chuàng)建更復雜的版本。實用程序和匯編器本身。然后,我們可以使用更復雜的匯編器來創(chuàng)建一個更高級的匯編器,然后一路走走。
有趣的是,當您使用高級編程語言(例如C或C ++)編寫程序時,編譯器不會將其直接編譯為機器代碼-而是,編譯器會在匯編源代碼中生成程序的中間版本代碼,然后將這些源代碼組裝成機器代碼。所有這些對于普通用戶都是不可見的,但是對于編譯器開發(fā)人員和專業(yè)程序員而言,訪問中間匯編代碼可能是無價的。
交叉匯編程序和宏匯編程序
在上面的思想實驗中,我們考慮了最壞的情況,其中HRRG是地球上唯一的計算機。對于后續(xù)機器的設(shè)計人員來說,事情變得容易得多,因為他們可以使用現(xiàn)有機器來加快速度。
例如,交叉匯編程序是一種匯編程序,可以將指令轉(zhuǎn)換為用于運行該計算機的計算機以外的計算機的機器代碼。我在HRRG上的同謀者EEWeb專家Joe Farr創(chuàng)建了一個在PC上運行的HRRG交叉匯編器,它采用HRRG的匯編語言編寫程序,并生成可在HRRG上運行的可執(zhí)行機器/目標代碼。下面的兩個圖像顯示了同一程序段的源代碼版本和目標代碼版本。
HRRG交叉匯編器源代碼視圖(來源:Joe Farr)
HRRG交叉匯編器目標代碼視圖(來源:Joe Farr)
更好的是,HRRG的匯編程序是宏匯編程序,它是可以執(zhí)行宏替換和擴展的匯編程序。這使我們能夠定義由一個或多個語句組成的宏,然后在程序中稍后使用這些宏名稱,從而避免了必須重寫語句。
舉一個簡單的例子,HRRG的指令集不包含HALT指令。但是,我們可以使用HRRG的匯編語言將這樣的指令實現(xiàn)為宏,如下所示:
.MACRO HALT
OR %0010, S1
.ENDMACRO
現(xiàn)在,我們可以將前面的程序示例中的OR指令替換為HALT,這有助于使程序更易于理解。此外,我們可以將所有宏捆綁到一個單獨的文件中,然后可以使用.INCLUDE指令將其導入到程序中。
編輯:hfy
-
寄存器
+關(guān)注
關(guān)注
31文章
5295瀏覽量
119838 -
cpu
+關(guān)注
關(guān)注
68文章
10807瀏覽量
210856
發(fā)布評論請先 登錄
相關(guān)推薦
評論