0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺談4位HRRG計算機定義的匯編語言

電子設計 ? 來源:eeweb ? 作者: Max Maxfield ? 2021-05-13 15:01 ? 次閱讀

我們要做的一件事就是為我們的4位HRRG計算機定義這樣的匯編語言,但是在我們陷入沉迷和放棄之前,我們首先需要引入一些概念。

大端與小端

當現實世界中的計算機使用多個字節(jié)表示數據值或內存地址時,有兩種主要技術可將這些字節(jié)存儲在內存中:最高有效字節(jié)(MSB)存儲在以下位置:具有最低地址的位置,在這種情況下,我們可以說它以“ big-end-first-first”存儲,或者最低有效字節(jié)(LSB)存儲在最低的地址,在這種情況下,我們可以說它是“小-最終至上?!?/p>

讓我們在HRRG計算機的上下文中考慮這兩種機制,它具有4位(1個半字節(jié))數據總線和12位(3個半字節(jié))地址總線,通過可視化我們如何在內存中存儲一??個3個半字節(jié)值$ 426來開始在$ 100的內存位置,如下所示:

pIYBAGCczaCAY5nuAAH4fj7FVtM809.png

大端(由HRRG使用)與小端。(資料來源:馬克斯·麥克菲爾德(Max Maxfield)

HRRG采用big-endian方法。當然,您可能不會對此感到驚訝,因為出于各種技術上的原因,而這些討論超出了這些討論的范圍,一些計算機設計師偏愛一種風格,而其他計算機設計師則偏向于另一種風格。直到人們對創(chuàng)建異構計算環(huán)境感興趣為止,這才真正變得無關緊要,在異構環(huán)境中,將多個不同的計算機連接在一起,以便可以在它們之間傳輸文件,此后引發(fā)了許多激烈的爭論。

1980年,丹尼·科恩(Danny Cohen)撰寫的著名論文《論神圣的戰(zhàn)爭與和平》,使用大尾數法和小尾數法來指代兩種存儲數據的技術。這些術語一直沿用至今,源于盎格魯愛爾蘭諷刺作家喬納森·斯威夫特(Jonathan Swift)所著的《格列佛游記》。小尾數和大尾數的綽號來自故事的那部分,兩個國家為此展開戰(zhàn)爭,首先要吃煮雞蛋的一端-小端還是大端!

令您驚訝的是,斯威夫特(Swift)在1726年進行了出色的工作,這是發(fā)明臺球桿的九年之前(在此之前,球員習慣用小狼牙棒來擊球)。

尋址模式

術語尋址模式是指指定指令操作數的方式。這些小流氓的名字和口味有很多不同的名稱,因此以下內容應僅作為概述。

出于這些討論的目的,我們將假設一個HRRG類型的體系結構,具有4位(1個半字節(jié))數據總線和12位(3個半字節(jié))地址總線。但是,下面介紹的寄存器和指令助記符是虛構的,僅用于進行這些討論時使用。

隱式(又名隱式):隱式(有時稱為隱式)尋址模式的情況下,目標本身由指令本身隱含。例如,假設我們有一個名為Q的寄存器和一個名為INCQ的指令,其目的是對寄存器Q的內容進行遞增(加1)。在這種情況下,我們所要做的就是一個沒有操作數的INCQ操作碼,如圖所示以下:

o4YBAGCcza6ASiCYAAB1lvkZRn4683.png

隱式尋址模式(來源:Max Maxfield)

假定程序計數器(PC)從地址$ 100開始,CPU將讀取并執(zhí)行隱含的操作碼。我們最終將PC指向地址$ 101,這是CPU希望在程序中找到下一個操作碼的位置。

立即:在立即尋址模式下,數據在操作碼后立即顯示。例如,假設我們有一個名為Q的寄存器和一個稱為LDQ的指令,其目的是使用立即尋址模式將一小部分數據加載到寄存器Q中,如下所示:

pIYBAGCczcCAbVjeAACic00isVc686.png

立即尋址模式(來源:Max Maxfield)

假定程序計數器(PC)從地址$ 100開始,CPU讀取操作碼,意識到此操作碼使用立即模式,并將數據nybble(在此示例中為$ F)加載到Q寄存器中。我們最終將PC指向地址$ 102,這是CPU希望在程序中找到下一個操作碼的位置。

相對:在相對尋址模式下,目標地址被指定為相對于程序計數器(PC)中當前值的偏移量。這樣的偏移量將被視為可以表示正值和負值的帶符號二進制數。

假設我們的偏移量表示為2個半字節(jié)值。由于2進位字段可以表示-128到+127范圍內的有符號數,因此這意味著偏移量可以指向當前PC值之前的128個位置(即,較低的內存地址)和之后的127個位置之間的某個存儲位置。當前的PC值(即更高的內存地址)。

純粹是為了使示例與此處顯示的其他示例相關聯,假設我們有一個名為Q的寄存器和一個稱為LDQ的指令,其目的是使用相對尋址模式將一小部分數據加載到寄存器Q中(盡管我們如果使用相同的助記符,則該LDQ與我們在前面示例中討論的LDQ指令將具有不同的操作碼。此外,讓我們假設偏移值為$ 08(十進制為+8),如下所示:

pIYBAGCczdOAFDYTAAHsLgOHBpo131.png

具有正偏移值的相對尋址模式。(資料來源:馬克斯·麥克菲爾德(Max Maxfield)

假定程序計數器(PC)從地址$ 100開始,CPU讀取操作碼,意識到它使用相對模式,然后將下面兩個包含偏移值的四位字節(jié)復制到內部(臨時)寄存器中。

接下來,它將偏移值添加到PC中的當前值,并使用結果指向包含數據nybble的位置。最后,它將數據值(在此示例中為$ F)加載到Q寄存器中。最后,PC指向地址$ 103,這是CPU希望在程序中找到下一個操作碼的位置。

純粹出于完整性考慮,讓我們考慮相對尋址的第二個示例,其中偏移值為$ F8(十進制為-8),如下所示:

o4YBAGCczeOAdpclAAEjSiMRQWU607.png

具有負偏移值的相對尋址模式。(資料來源:馬克斯·麥克菲爾德(Max Maxfield)

重要的是要注意,除了上面說明的數據操作指令外,相對尋址還可以用于執(zhí)行跳轉或分支指令。

當然,并非所有處理器都支持所有類型指令的所有尋址模式。例如,正如我們在上一專欄中所討論的那樣,6502微處理器具有8位數據總線和16位地址總線。對于其JMP(“無條件跳轉”)指令,6502僅支持使用16位(2字節(jié))地址的絕對和間接尋址(下面介紹絕對和間接模式)。但是,6502還支持一組分支指令,這些分支指令采用8位(1字節(jié))相對地址。正如我在該專欄中指出的:

程序往往會進行很多跳轉,例如循環(huán)循環(huán),因此在時鐘有限的日子里,使用1字節(jié)的分支地址而不是2字節(jié)的跳轉地址可能會節(jié)省大量的時間和空間。速度,處理器周期和內存位置。

Zilog Z80微處理器不支持相對尋址,因此您必須使用Intel 8086或更高版本才能使用相對尋址模式查看“短跳轉”指令。

最后一點,在上面的討論中,當說明要添加偏移量的值時,我們多次使用了短語“ PC中的當前值”。當“推來推去”時,我們使用了$ 103的值,這是下一個操作碼的地址。我們?yōu)槭裁词褂眠@個值?使用$ 100(原始操作碼的地址)或$ 102(偏移量中第二個小節(jié)的地址)是否更有意義。

好吧,假設我們正在執(zhí)行某種形式的分支指令,而不是執(zhí)行我們虛構的LDQ指令?,F在考慮如果偏移值為$ 0會發(fā)生什么。如果偏移量是從分支指令操作碼的地址$ 100開始,則偏移量$ 0將導致無限循環(huán)(如果采用了分支)?;蛘?,如果偏移量是從地址$ 102處的操作數的第二個字節(jié)開始的,則偏移量$ 0將導致CPU將操作數的第二個nybble誤認為是一個操作碼。歸根結底,如果偏移量為$ 0,則按照我們的原始指令立即跳轉到操作碼是有意義的;因此,我們使用下一個操作碼的地址作為“ PC中的當前值”這一事實。

只是為了確認所有這些內容,因為在我所看到的任何地方它都沒有得到很好的記錄,所以我請我的新手尼克·比爾德(Nick Bild)(基于6502的虛擬現實系統的創(chuàng)建者)提供經驗證明。為此,尼克創(chuàng)建了一個小型的6502匯編程序,如下所示:

o4YBAGCczfGAb2zpAAG7c-WU4qk598.png

6502匯編程序(來源:Nick Bild)

請記住,6502具有8位數據總線和16位地址總線。遵守地址$ 0004的BNE(“如果不相等則分支”)指令。如果滿足分支條件,該指令將跳轉到地址$ 0008的JUMPHERE標簽。現在觀察到,由匯編程序生成并存儲在地址$ 0005中的偏移值為$ 02。當然,$ 0008 – $ 02 = $ 0006,它是LDY(“裝載索引寄存器Y”)指令的地址;也就是說,緊跟在BNE指令之后的操作碼。優(yōu)質教育

絕對(也稱為直接):在絕對(有時稱為直接)尋址模式下,目標地址在操作碼后立即顯示。例如,假設我們有一個名為Q的寄存器和一條稱為LDQ的指令,其目的是使用絕對尋址模式將數據的小節(jié)加載到寄存器Q中,如下所示(再次,盡管我們使用的是相同的助記符,但該LDQ與前面示例中討論的LDQ指令會有不同的操作碼):

pIYBAGCczgCABD4mAAGC2TmfZN8403.png

絕對尋址模式(來源:Max Maxfield)

假設程序計數器(PC)從地址$ 100開始,CPU讀取操作碼,意識到該操作碼使用絕對模式,然后將以下三個字節(jié)(在本示例中為$ 426)加載到內部寄存器中。然后,CPU使用此內部寄存器的內容指向內存中的數據寄存器(在此示例中為$ F),并將其裝入Q寄存器。我們最終將PC指向地址$ 104,這是CPU期望在程序中找到下一個操作碼的位置。

與我們虛構的LDQ指令相反,假設我們的地址為$ 100的操作碼指示CPU使用絕對尋址模式執(zhí)行無條件的JMP。在這種情況下,CPU將跳轉(設置PC)以尋址$ 426。

間接的:這是開始變得有趣的地方。假設我們有一個名為Q的寄存器和一個稱為LDQ的指令,其目的是使用間接尋址模式將一小部分數據加載到寄存器Q中,如下所示:

o4YBAGCczheAG_XFAAGpYNU9dvI967.png

間接尋址模式(來源:Max Maxfield)

至于絕對模式,操作碼后面的三個字節(jié)包含一個地址,該地址被加載到內部寄存器中。但是,在這種情況下,該地址并不直接指向數據,而是指向另一個3位地址的第一個地址,而該第二個地址用于指向數據。

與我們想象中的LDQ指令相反,假設我們的地址為$ 100的操作碼指示CPU使用間接尋址模式執(zhí)行無條件的JMP。在這種情況下,CPU最終將跳轉(設置PC)以尋址$ 971。

索引(也稱為絕對索引):此模式與絕對模式非常相似,不同之處在于它還涉及索引(X)寄存器。假設我們有一個名為Q的寄存器和一個稱為LDQ的指令,其目的是使用索引尋址模式將一小部分數據加載到寄存器Q中,如下所示:

pIYBAGCcziSACwQfAAGi50qWxeg474.png

索引尋址模式(來源:Max Maxfield)

假設程序計數器(PC)從地址$ 100開始,CPU讀取操作碼,意識到此操作碼使用索引模式,然后將以下三個字節(jié)(在本示例中為$ 426)加載到內部寄存器中。然后,CPU將此內部寄存器的內容添加到索引(X)寄存器的內容中,并使用結果指向內存中的數據緩沖區(qū)(在此示例中為$ F),并將其裝入Q寄存器。我們最終將PC指向地址$ 104,這是CPU期望在程序中找到下一個操作碼的位置。

與我們想象中的LDQ指令相反,假設我們的地址為$ 100的操作碼指示CPU使用索引尋址模式執(zhí)行無條件的JMP。在這種情況下,CPU最終將跳轉(設置PC)以尋址549美元。

索引間接:此模式反映了索引模式和間接模式的一種可能組合。假設我們有一個名為Q的寄存器和一個稱為LDQ的指令,其目的是使用索引間接尋址模式將一小部分數據加載到寄存器Q中,如下所示:

pIYBAGCczjaAELE1AAD1y4N6VSQ531.png

索引間接尋址模式(來源:Max Maxfield)

假定程序計數器(PC)從地址$ 100開始,CPU讀取操作碼,意識到此操作碼使用索引間接模式,并將以下三個字節(jié)(在本示例中為$ 426)加載到內部寄存器中。然后,CPU將此內部寄存器的內容添加到索引(X)寄存器的內容中,以生成一個新地址。但是,在這種情況下,新地址不會直接指向數據,而是指向另一個3位地址的第一個地址,而這個第二地址用于指向將要加載到數據中的數據。 Q寄存器。

與我們虛構的LDQ指令相反,假設我們的地址為$ 100的操作碼指示CPU使用索引間接尋址模式執(zhí)行無條件JMP。在這種情況下,CPU最終將跳轉(設置PC)以解決$ 738。

間接索引:此模式反映了索引模式和間接模式的替代組合。假設我們有一個名為Q的寄存器和一個稱為LDQ的指令,其目的是使用間接索引尋址模式將一小部分數據加載到寄存器Q中,如下所示:

o4YBAGCczkuAXwIxAAD3y23af1U725.png

間接索引尋址模式(來源:Max Maxfield)

假定程序計數器(PC)從地址$ 100開始,CPU讀取操作碼,意識到此操作碼使用間接索引模式,并將以下三個字節(jié)(在本示例中為$ 426)加載到內部寄存器中。該地址指向另一個3位地址的第一個地址,該地址本身被復制到內部寄存器中。然后,CPU將第二個內部寄存器的內容添加到索引(X)寄存器的內容中,以生成一個新地址,該地址指向將要加載到Q寄存器中的數據。

與我們想象中的LDQ指令相反,假設我們的地址為$ 100的操作碼指示CPU使用間接索引尋址模式執(zhí)行無條件的JMP。在這種情況下,CPU最終將跳轉(設置PC)以尋址$ BD4。

自動遞增和自動遞減:除了上面討論的基本索引模式外,某些CPU還支持自動遞增和自動遞減版本,其中將索引寄存器的內容添加到臨時寄存器中的地址之后,遞增或遞減索引寄存器。

實際上,由于增量/減量是在添加之后進行的,因此應將這些模式更恰當地稱為“自動后增量”和“自動后減量”。這是因為某些處理器還支持“預自動遞增”和“預自動遞減”,其中在將索引寄存器的內容添加到臨時寄存器的地址之前,對索引寄存器進行遞增或遞減操作。

還要注意,自動遞增和自動遞減的所有四種形式都可以潛在地應用于索引間接和間接索引模式。

我的天?。≌娴膯??
我知道,當我們考慮上述所有可能的尋址模式時,有很多事情需要解決。不要驚慌!HRRG僅支持這些模式的子集,而這是最簡單的模式,即隱式,立即,絕對和索引模式。

另一方面,我們設計HRRG的方式意味著它有時在同一條指令中使用多種模式。我能說什么這是一個有趣的舊世界。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5253

    瀏覽量

    119212
收藏 人收藏

    評論

    相關推薦

    全面解析構建4計算機匯編語言匯編

    作為我們討論的起點,讓我們進行一個簡單的思想實驗。假設我們剛剛完成了4HRRG計算機的構建。我們還假設它是地球上的第一臺計算機。也就是說,
    的頭像 發(fā)表于 05-13 14:52 ?2773次閱讀
    全面解析構建<b class='flag-5'>4</b><b class='flag-5'>位</b><b class='flag-5'>計算機</b>:<b class='flag-5'>匯編語言</b>和<b class='flag-5'>匯編</b>器

    32微型計算機原理與接口技術 (pdf電子書下載)

    32微型計算機原理與接口技術以Intel 80486微處理器為背景,講述32微型計算機原理、匯編語言程序設計和接口技術?!?2
    發(fā)表于 05-03 12:17

    什么是匯編語言

    基于C++寶典的學習一、什么是匯編語言匯編語言是一種功能很強的程序設計語言,也是利用了計算機所有硬件特性并能直接控制硬件的語言。在
    發(fā)表于 07-19 06:05

    匯編語言是什么?怎樣去學習匯編語言

    匯編語言是什么?怎樣去學習匯編語言呢?計算機怎么識別你寫的代碼呢?
    發(fā)表于 11-29 06:03

    什么是匯編語言

    文章目錄前言一、 匯編語言簡介1.1 什么是匯編語言1.2機器語言簡介1.3 匯編語言的演變史1.4 匯編語言的廣義組成二、硬件與軟件2.1
    發(fā)表于 02-24 07:01

    計算機組成原理與匯編語言程序設計

    計算機組成原理與匯編語言程序設計是為中央電大計算機組成原理與匯編語言程序設計課程編寫的教材。在開始學習本書之前,請大家務必先認真閱讀這篇前言,它將告訴你本課
    發(fā)表于 10-21 17:56 ?0次下載
    <b class='flag-5'>計算機</b>組成原理與<b class='flag-5'>匯編語言</b>程序設計

    計算機組成原理與匯編語言習題一

    計算機組成原理與匯編語言習題一   硬盤低格格式化是對硬盤最徹底的初始化方式,經過低格后的硬盤,原來保護的數據將全部丟失
    發(fā)表于 04-15 16:16 ?521次閱讀

    微機原理匯編語言接口技術

    16/32微機原理匯編語言與接口技術,重點大學計算機教材
    發(fā)表于 12-31 10:50 ?0次下載

    計算機語言的分類

    本視頻主要詳細介紹了計算機語言的分類,分別有機器語言、匯編語言、高級語言等。
    的頭像 發(fā)表于 12-27 16:04 ?2.6w次閱讀
    <b class='flag-5'>計算機語言</b>的分類

    計算機學習教程之指令系統與匯編語言程序設計課件免費下載

    本文檔的主要內容詳細介紹的是計算機學習教程之指令系統與匯編語言程序設計課件免費下載包括了:1.匯編語言程序設計,2.程序設計舉例,
    發(fā)表于 01-03 08:00 ?0次下載

    計算機的機器語言匯編語言與高級語言的詳細資料介紹

    計算機語言通常是一個能完整、準確和規(guī)則地表達人們的意圖,并用以指揮或控制計算機工作的“符號系統”。計算機語言通常分為三類:即機器語言、匯編語言
    的頭像 發(fā)表于 02-06 16:11 ?5623次閱讀

    [從零學習匯編語言] - 計算機中的硬件與軟件

    文章目錄前言一、 匯編語言簡介1.1 什么是匯編語言1.2 機器語言簡介1.3 匯編語言的演變史1.4 匯編語言的廣義組成二、硬件與軟件2
    發(fā)表于 12-31 19:55 ?10次下載
    [從零學習<b class='flag-5'>匯編語言</b>] - <b class='flag-5'>計算機</b>中的硬件與軟件

    構建 4 計算機匯編語言匯編器(第 2 部分)

    的大端與小端方式的概念。 我們還概述了計算機設計者可能決定支持的一些尋址模式。 現在是時候開始為我們的 4 HRRG 計算機考慮
    發(fā)表于 08-01 17:52 ?788次閱讀
    構建 <b class='flag-5'>4</b> <b class='flag-5'>位</b><b class='flag-5'>計算機</b>:<b class='flag-5'>匯編語言</b>和<b class='flag-5'>匯編</b>器(第 2 部分)

    構建 4 計算機匯編語言匯編器(第 1 部分)

    我們已經到了需要為 4 HRRG 計算機定義匯編語言的地步,但首先我們需要考慮某些概念。 如
    發(fā)表于 08-01 17:39 ?842次閱讀
    構建 <b class='flag-5'>4</b> <b class='flag-5'>位</b><b class='flag-5'>計算機</b>:<b class='flag-5'>匯編語言</b>和<b class='flag-5'>匯編</b>器(第 1 部分)

    匯編指令是什么 計算機語言匯編指令簡介

    匯編指令簡介 匯編語言計算機語言的一種,是一種低級語言。相比高級語言,匯編語言更接近底層硬件,
    的頭像 發(fā)表于 12-13 11:18 ?912次閱讀
    <b class='flag-5'>匯編</b>指令是什么 <b class='flag-5'>計算機語言</b><b class='flag-5'>匯編</b>指令簡介