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