我們要做的一件事就是為我們的4位HRRG計(jì)算機(jī)定義這樣的匯編語(yǔ)言,但是在我們陷入沉迷和放棄之前,我們首先需要引入一些概念。
大端與小端
當(dāng)現(xiàn)實(shí)世界中的計(jì)算機(jī)使用多個(gè)字節(jié)表示數(shù)據(jù)值或內(nèi)存地址時(shí),有兩種主要技術(shù)可將這些字節(jié)存儲(chǔ)在內(nèi)存中:最高有效字節(jié)(MSB)存儲(chǔ)在以下位置:具有最低地址的位置,在這種情況下,我們可以說(shuō)它以“ big-end-first-first”存儲(chǔ),或者最低有效字節(jié)(LSB)存儲(chǔ)在最低的地址,在這種情況下,我們可以說(shuō)它是“小-最終至上。”
讓我們?cè)贖RRG計(jì)算機(jī)的上下文中考慮這兩種機(jī)制,它具有4位(1個(gè)半字節(jié))數(shù)據(jù)總線和12位(3個(gè)半字節(jié))地址總線,通過(guò)可視化我們?nèi)绾卧趦?nèi)存中存儲(chǔ)一??個(gè)3個(gè)半字節(jié)值$ 426來(lái)開(kāi)始在$ 100的內(nèi)存位置,如下所示:
大端(由HRRG使用)與小端。(資料來(lái)源:馬克斯·麥克菲爾德(Max Maxfield)
HRRG采用big-endian方法。當(dāng)然,您可能不會(huì)對(duì)此感到驚訝,因?yàn)槌鲇诟鞣N技術(shù)上的原因,而這些討論超出了這些討論的范圍,一些計(jì)算機(jī)設(shè)計(jì)師偏愛(ài)一種風(fēng)格,而其他計(jì)算機(jī)設(shè)計(jì)師則偏向于另一種風(fēng)格。直到人們對(duì)創(chuàng)建異構(gòu)計(jì)算環(huán)境感興趣為止,這才真正變得無(wú)關(guān)緊要,在異構(gòu)環(huán)境中,將多個(gè)不同的計(jì)算機(jī)連接在一起,以便可以在它們之間傳輸文件,此后引發(fā)了許多激烈的爭(zhēng)論。
1980年,丹尼·科恩(Danny Cohen)撰寫(xiě)的著名論文《論神圣的戰(zhàn)爭(zhēng)與和平》,使用大尾數(shù)法和小尾數(shù)法來(lái)指代兩種存儲(chǔ)數(shù)據(jù)的技術(shù)。這些術(shù)語(yǔ)一直沿用至今,源于盎格魯愛(ài)爾蘭諷刺作家喬納森·斯威夫特(Jonathan Swift)所著的《格列佛游記》。小尾數(shù)和大尾數(shù)的綽號(hào)來(lái)自故事的那部分,兩個(gè)國(guó)家為此展開(kāi)戰(zhàn)爭(zhēng),首先要吃煮雞蛋的一端-小端還是大端!
令您驚訝的是,斯威夫特(Swift)在1726年進(jìn)行了出色的工作,這是發(fā)明臺(tái)球桿的九年之前(在此之前,球員習(xí)慣用小狼牙棒來(lái)?yè)羟颍?/p>
尋址模式
術(shù)語(yǔ)尋址模式是指指定指令操作數(shù)的方式。這些小流氓的名字和口味有很多不同的名稱,因此以下內(nèi)容應(yīng)僅作為概述。
出于這些討論的目的,我們將假設(shè)一個(gè)HRRG類型的體系結(jié)構(gòu),具有4位(1個(gè)半字節(jié))數(shù)據(jù)總線和12位(3個(gè)半字節(jié))地址總線。但是,下面介紹的寄存器和指令助記符是虛構(gòu)的,僅用于進(jìn)行這些討論時(shí)使用。
隱式(又名隱式):在隱式(有時(shí)稱為隱式)尋址模式的情況下,目標(biāo)本身由指令本身隱含。例如,假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)名為INCQ的指令,其目的是對(duì)寄存器Q的內(nèi)容進(jìn)行遞增(加1)。在這種情況下,我們所要做的就是一個(gè)沒(méi)有操作數(shù)的INCQ操作碼,如圖所示以下:
隱式尋址模式(來(lái)源:Max Maxfield)
假定程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU將讀取并執(zhí)行隱含的操作碼。我們最終將PC指向地址$ 101,這是CPU希望在程序中找到下一個(gè)操作碼的位置。
立即:在立即尋址模式下,數(shù)據(jù)在操作碼后立即顯示。例如,假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)稱為L(zhǎng)DQ的指令,其目的是使用立即尋址模式將一小部分?jǐn)?shù)據(jù)加載到寄存器Q中,如下所示:
立即尋址模式(來(lái)源:Max Maxfield)
假定程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU讀取操作碼,意識(shí)到此操作碼使用立即模式,并將數(shù)據(jù)nybble(在此示例中為$ F)加載到Q寄存器中。我們最終將PC指向地址$ 102,這是CPU希望在程序中找到下一個(gè)操作碼的位置。
相對(duì):在相對(duì)尋址模式下,目標(biāo)地址被指定為相對(duì)于程序計(jì)數(shù)器(PC)中當(dāng)前值的偏移量。這樣的偏移量將被視為可以表示正值和負(fù)值的帶符號(hào)二進(jìn)制數(shù)。
假設(shè)我們的偏移量表示為2個(gè)半字節(jié)值。由于2進(jìn)位字段可以表示-128到+127范圍內(nèi)的有符號(hào)數(shù),因此這意味著偏移量可以指向當(dāng)前PC值之前的128個(gè)位置(即,較低的內(nèi)存地址)和之后的127個(gè)位置之間的某個(gè)存儲(chǔ)位置。當(dāng)前的PC值(即更高的內(nèi)存地址)。
純粹是為了使示例與此處顯示的其他示例相關(guān)聯(lián),假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)稱為L(zhǎng)DQ的指令,其目的是使用相對(duì)尋址模式將一小部分?jǐn)?shù)據(jù)加載到寄存器Q中(盡管我們?nèi)绻褂孟嗤闹浄?,則該LDQ與我們?cè)谇懊媸纠杏懻摰腖DQ指令將具有不同的操作碼。此外,讓我們假設(shè)偏移值為$ 08(十進(jìn)制為+8),如下所示:
具有正偏移值的相對(duì)尋址模式。(資料來(lái)源:馬克斯·麥克菲爾德(Max Maxfield)
假定程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU讀取操作碼,意識(shí)到它使用相對(duì)模式,然后將下面兩個(gè)包含偏移值的四位字節(jié)復(fù)制到內(nèi)部(臨時(shí))寄存器中。
接下來(lái),它將偏移值添加到PC中的當(dāng)前值,并使用結(jié)果指向包含數(shù)據(jù)nybble的位置。最后,它將數(shù)據(jù)值(在此示例中為$ F)加載到Q寄存器中。最后,PC指向地址$ 103,這是CPU希望在程序中找到下一個(gè)操作碼的位置。
純粹出于完整性考慮,讓我們考慮相對(duì)尋址的第二個(gè)示例,其中偏移值為$ F8(十進(jìn)制為-8),如下所示:
具有負(fù)偏移值的相對(duì)尋址模式。(資料來(lái)源:馬克斯·麥克菲爾德(Max Maxfield)
重要的是要注意,除了上面說(shuō)明的數(shù)據(jù)操作指令外,相對(duì)尋址還可以用于執(zhí)行跳轉(zhuǎn)或分支指令。
當(dāng)然,并非所有處理器都支持所有類型指令的所有尋址模式。例如,正如我們?cè)谏弦粚谥兴懻摰哪菢樱?502微處理器具有8位數(shù)據(jù)總線和16位地址總線。對(duì)于其JMP(“無(wú)條件跳轉(zhuǎn)”)指令,6502僅支持使用16位(2字節(jié))地址的絕對(duì)和間接尋址(下面介紹絕對(duì)和間接模式)。但是,6502還支持一組分支指令,這些分支指令采用8位(1字節(jié))相對(duì)地址。正如我在該專欄中指出的:
程序往往會(huì)進(jìn)行很多跳轉(zhuǎn),例如循環(huán)循環(huán),因此在時(shí)鐘有限的日子里,使用1字節(jié)的分支地址而不是2字節(jié)的跳轉(zhuǎn)地址可能會(huì)節(jié)省大量的時(shí)間和空間。速度,處理器周期和內(nèi)存位置。
Zilog Z80微處理器不支持相對(duì)尋址,因此您必須使用Intel 8086或更高版本才能使用相對(duì)尋址模式查看“短跳轉(zhuǎn)”指令。
最后一點(diǎn),在上面的討論中,當(dāng)說(shuō)明要添加偏移量的值時(shí),我們多次使用了短語(yǔ)“ PC中的當(dāng)前值”。當(dāng)“推來(lái)推去”時(shí),我們使用了$ 103的值,這是下一個(gè)操作碼的地址。我們?yōu)槭裁词褂眠@個(gè)值?使用$ 100(原始操作碼的地址)或$ 102(偏移量中第二個(gè)小節(jié)的地址)是否更有意義。
好吧,假設(shè)我們正在執(zhí)行某種形式的分支指令,而不是執(zhí)行我們虛構(gòu)的LDQ指令?,F(xiàn)在考慮如果偏移值為$ 0會(huì)發(fā)生什么。如果偏移量是從分支指令操作碼的地址$ 100開(kāi)始,則偏移量$ 0將導(dǎo)致無(wú)限循環(huán)(如果采用了分支)。或者,如果偏移量是從地址$ 102處的操作數(shù)的第二個(gè)字節(jié)開(kāi)始的,則偏移量$ 0將導(dǎo)致CPU將操作數(shù)的第二個(gè)nybble誤認(rèn)為是一個(gè)操作碼。歸根結(jié)底,如果偏移量為$ 0,則按照我們的原始指令立即跳轉(zhuǎn)到操作碼是有意義的;因此,我們使用下一個(gè)操作碼的地址作為“ PC中的當(dāng)前值”這一事實(shí)。
只是為了確認(rèn)所有這些內(nèi)容,因?yàn)樵谖宜吹降娜魏蔚胤剿紱](méi)有得到很好的記錄,所以我請(qǐng)我的新手尼克·比爾德(Nick Bild)(基于6502的虛擬現(xiàn)實(shí)系統(tǒng)的創(chuàng)建者)提供經(jīng)驗(yàn)證明。為此,尼克創(chuàng)建了一個(gè)小型的6502匯編程序,如下所示:
6502匯編程序(來(lái)源:Nick Bild)
請(qǐng)記住,6502具有8位數(shù)據(jù)總線和16位地址總線。遵守地址$ 0004的BNE(“如果不相等則分支”)指令。如果滿足分支條件,該指令將跳轉(zhuǎn)到地址$ 0008的JUMPHERE標(biāo)簽。現(xiàn)在觀察到,由匯編程序生成并存儲(chǔ)在地址$ 0005中的偏移值為$ 02。當(dāng)然,$ 0008 – $ 02 = $ 0006,它是LDY(“裝載索引寄存器Y”)指令的地址;也就是說(shuō),緊跟在BNE指令之后的操作碼。優(yōu)質(zhì)教育
絕對(duì)(也稱為直接):在絕對(duì)(有時(shí)稱為直接)尋址模式下,目標(biāo)地址在操作碼后立即顯示。例如,假設(shè)我們有一個(gè)名為Q的寄存器和一條稱為L(zhǎng)DQ的指令,其目的是使用絕對(duì)尋址模式將數(shù)據(jù)的小節(jié)加載到寄存器Q中,如下所示(再次,盡管我們使用的是相同的助記符,但該LDQ與前面示例中討論的LDQ指令會(huì)有不同的操作碼):
絕對(duì)尋址模式(來(lái)源:Max Maxfield)
假設(shè)程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU讀取操作碼,意識(shí)到該操作碼使用絕對(duì)模式,然后將以下三個(gè)字節(jié)(在本示例中為$ 426)加載到內(nèi)部寄存器中。然后,CPU使用此內(nèi)部寄存器的內(nèi)容指向內(nèi)存中的數(shù)據(jù)寄存器(在此示例中為$ F),并將其裝入Q寄存器。我們最終將PC指向地址$ 104,這是CPU期望在程序中找到下一個(gè)操作碼的位置。
與我們虛構(gòu)的LDQ指令相反,假設(shè)我們的地址為$ 100的操作碼指示CPU使用絕對(duì)尋址模式執(zhí)行無(wú)條件的JMP。在這種情況下,CPU將跳轉(zhuǎn)(設(shè)置PC)以尋址$ 426。
間接的:這是開(kāi)始變得有趣的地方。假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)稱為L(zhǎng)DQ的指令,其目的是使用間接尋址模式將一小部分?jǐn)?shù)據(jù)加載到寄存器Q中,如下所示:
間接尋址模式(來(lái)源:Max Maxfield)
至于絕對(duì)模式,操作碼后面的三個(gè)字節(jié)包含一個(gè)地址,該地址被加載到內(nèi)部寄存器中。但是,在這種情況下,該地址并不直接指向數(shù)據(jù),而是指向另一個(gè)3位地址的第一個(gè)地址,而該第二個(gè)地址用于指向數(shù)據(jù)。
與我們想象中的LDQ指令相反,假設(shè)我們的地址為$ 100的操作碼指示CPU使用間接尋址模式執(zhí)行無(wú)條件的JMP。在這種情況下,CPU最終將跳轉(zhuǎn)(設(shè)置PC)以尋址$ 971。
索引(也稱為絕對(duì)索引):此模式與絕對(duì)模式非常相似,不同之處在于它還涉及索引(X)寄存器。假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)稱為L(zhǎng)DQ的指令,其目的是使用索引尋址模式將一小部分?jǐn)?shù)據(jù)加載到寄存器Q中,如下所示:
索引尋址模式(來(lái)源:Max Maxfield)
假設(shè)程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU讀取操作碼,意識(shí)到此操作碼使用索引模式,然后將以下三個(gè)字節(jié)(在本示例中為$ 426)加載到內(nèi)部寄存器中。然后,CPU將此內(nèi)部寄存器的內(nèi)容添加到索引(X)寄存器的內(nèi)容中,并使用結(jié)果指向內(nèi)存中的數(shù)據(jù)緩沖區(qū)(在此示例中為$ F),并將其裝入Q寄存器。我們最終將PC指向地址$ 104,這是CPU期望在程序中找到下一個(gè)操作碼的位置。
與我們想象中的LDQ指令相反,假設(shè)我們的地址為$ 100的操作碼指示CPU使用索引尋址模式執(zhí)行無(wú)條件的JMP。在這種情況下,CPU最終將跳轉(zhuǎn)(設(shè)置PC)以尋址549美元。
索引間接:此模式反映了索引模式和間接模式的一種可能組合。假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)稱為L(zhǎng)DQ的指令,其目的是使用索引間接尋址模式將一小部分?jǐn)?shù)據(jù)加載到寄存器Q中,如下所示:
索引間接尋址模式(來(lái)源:Max Maxfield)
假定程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU讀取操作碼,意識(shí)到此操作碼使用索引間接模式,并將以下三個(gè)字節(jié)(在本示例中為$ 426)加載到內(nèi)部寄存器中。然后,CPU將此內(nèi)部寄存器的內(nèi)容添加到索引(X)寄存器的內(nèi)容中,以生成一個(gè)新地址。但是,在這種情況下,新地址不會(huì)直接指向數(shù)據(jù),而是指向另一個(gè)3位地址的第一個(gè)地址,而這個(gè)第二地址用于指向?qū)⒁虞d到數(shù)據(jù)中的數(shù)據(jù)。 Q寄存器。
與我們虛構(gòu)的LDQ指令相反,假設(shè)我們的地址為$ 100的操作碼指示CPU使用索引間接尋址模式執(zhí)行無(wú)條件JMP。在這種情況下,CPU最終將跳轉(zhuǎn)(設(shè)置PC)以解決$ 738。
間接索引:此模式反映了索引模式和間接模式的替代組合。假設(shè)我們有一個(gè)名為Q的寄存器和一個(gè)稱為L(zhǎng)DQ的指令,其目的是使用間接索引尋址模式將一小部分?jǐn)?shù)據(jù)加載到寄存器Q中,如下所示:
間接索引尋址模式(來(lái)源:Max Maxfield)
假定程序計(jì)數(shù)器(PC)從地址$ 100開(kāi)始,CPU讀取操作碼,意識(shí)到此操作碼使用間接索引模式,并將以下三個(gè)字節(jié)(在本示例中為$ 426)加載到內(nèi)部寄存器中。該地址指向另一個(gè)3位地址的第一個(gè)地址,該地址本身被復(fù)制到內(nèi)部寄存器中。然后,CPU將第二個(gè)內(nèi)部寄存器的內(nèi)容添加到索引(X)寄存器的內(nèi)容中,以生成一個(gè)新地址,該地址指向?qū)⒁虞d到Q寄存器中的數(shù)據(jù)。
與我們想象中的LDQ指令相反,假設(shè)我們的地址為$ 100的操作碼指示CPU使用間接索引尋址模式執(zhí)行無(wú)條件的JMP。在這種情況下,CPU最終將跳轉(zhuǎn)(設(shè)置PC)以尋址$ BD4。
自動(dòng)遞增和自動(dòng)遞減:除了上面討論的基本索引模式外,某些CPU還支持自動(dòng)遞增和自動(dòng)遞減版本,其中將索引寄存器的內(nèi)容添加到臨時(shí)寄存器中的地址之后,遞增或遞減索引寄存器。
實(shí)際上,由于增量/減量是在添加之后進(jìn)行的,因此應(yīng)將這些模式更恰當(dāng)?shù)胤Q為“自動(dòng)后增量”和“自動(dòng)后減量”。這是因?yàn)槟承┨幚砥鬟€支持“預(yù)自動(dòng)遞增”和“預(yù)自動(dòng)遞減”,其中在將索引寄存器的內(nèi)容添加到臨時(shí)寄存器的地址之前,對(duì)索引寄存器進(jìn)行遞增或遞減操作。
還要注意,自動(dòng)遞增和自動(dòng)遞減的所有四種形式都可以潛在地應(yīng)用于索引間接和間接索引模式。
我的天?。≌娴膯??
我知道,當(dāng)我們考慮上述所有可能的尋址模式時(shí),有很多事情需要解決。不要驚慌!HRRG僅支持這些模式的子集,而這是最簡(jiǎn)單的模式,即隱式,立即,絕對(duì)和索引模式。
另一方面,我們?cè)O(shè)計(jì)HRRG的方式意味著它有時(shí)在同一條指令中使用多種模式。我能說(shuō)什么這是一個(gè)有趣的舊世界。
編輯:hfy
-
寄存器
+關(guān)注
關(guān)注
31文章
5274瀏覽量
119677
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論