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