一、前言
直接定址、間接定址、立即定址,只是cpu在通過匯流排與記憶體互動時的不同互動方法,而產生的三種概念詞!
對於這些定址方式,很多人沒有聽說過,但是對於學習彙編的同學來說,非常熟悉,很多書中都有提到過這幾種定址方式,但是沒有細說,這裡來給大家詳細介紹一下這三種定址方式的不同體現在**!
二、直接定址
詳細說一下:
假如有乙個記憶體,且大小是:0x00000000~0xffffffff
每個實體地址代表乙個記憶體單元(這裡拋開虛擬記憶體管理機制),那麼我想要取得0x00000001位址裡的資料,首先cpu需要通過位址匯流排找到該記憶體單元,然後通過控制匯流排確定操作方法,在通過資料匯流排將其資料送回來,便於處理!
那麼我們要怎樣將位址給cpu呢?
答:放到cs段位址暫存器中,cs暫存器負責儲存段位址,cpu會根據此段位址,去記憶體中將指令讀取到cs:ip暫存器當中,然後執行!
move ax,[ds:0x00000001h]
或
move ax,[0x00000001h]
(ax記憶體=ds+0x00000001h)
ds是段暫存器,這裡無需多說,詳細介紹可以看這篇文章:c語言記憶體模型詳細介紹_堆疊介紹
作業系統會自動幫我們把cs:ir暫存器指向我們的**段,當cpu將指令取到cs:ip暫存器以後,就會通過cu控制單元解碼解析指令轉換成對應的電平訊號,驅動cpu電晶體工作!
cpu會直接將段位址+0x00000001的實體地址通過北橋,傳送給記憶體晶元,記憶體晶元會把該位址裡的資料取回來傳遞給cpu,當cpu接受到返回來的資料時,會把該資料寫入到ax暫存器,這樣乙個指令就執行完成了,實際上並不是乙個指令,其實cpu要分好幾次時鐘週期來執行,第一次去將ds暫存器裡的段首位址讀取出來,第二次加上0x00000001,第三次去記憶體中取資料,第四次將獲取到的資料寫入到ax中,即四個個時鐘週期來完成乙個指令,其中還會用到alu運算單元來進行段位址+偏移位址的運算,所以實際上可能需要多個時鐘週期來完成!
cpu是由電晶體來驅動的,每次開關驅動一次都稱為一次時鐘週期,時間周長不算,一般用赫茲來表示時鐘週期的單位!
上面的過程僅一步到位非常之快,因為我們直接給出了實際實體地址!
下面來說說間接定址
三、間接定址
間接定址是建立在直接定址之上的一種概念,位址不是直接定址那樣直接給出,而是通過某個特定的記憶體單元得出,第一次是得到某個特定記憶體單元裡的位址資料,第二次在將得出的位址進行ds+偏移位址h的運算直接定址!
這樣說可能有點含糊不清,不過來看一下這段彙編**,你就應該能明白直接定址與間接定址之間的區別了:
mov esp,0x00000001
mov ax,[esp]
esp、eax等暫存器均為8086定址暫存器,用於暫時存放位址的,並且定址時也是以ds+esp的方式!
其實esp和eax等e開頭的暫存器和ax,bx,cx通用暫存器的作用沒有區別,只是cpu設計者,設計出這麼多暫存器是為了方便區分,某些暫存器做某些事情,這樣更加方便於統一和區分,你也可以使用bx來進行間接定址,只要你在裡面寫上,這個括號在彙編裡表示定址括號,如果你把bx用括起來,cpu會把bx裡的內容當做位址看待!
這樣的話,cpu要做的工作可就很多了,首先要將0x00000001位址送入到esp裡,在將esp裡的位址取出來,然後通過ds+esp在去記憶體中定址,在取回來放到ax中!
所以間接定址說的明白一點,就是通過暫存器得到要定址的位址,然後在定址,而非直接給出位址直接定址!
上面有個疑惑,就是直接定址的位址是怎麼來的?
其如果使用間接定址,在8085系列的cpu設計出了r0,r1的暫存器,並且如果間接定址使用@符號表示
mov r0,0x00000001
mov ax,@r0
用於表示間接定址,不過這種定址方式更加少見了,因為自8086系列cpu出現以後,指令的出現,更加方便於定址,並且直觀性更強,但是還是可以使用上面這種方法定址的,因為向前相容(即新的東西相容老的東西),只是不同架構的cpu編寫方法不同,但意思都是乙個樣!
三、立即定址
通過上面的了解,立即定址就非常簡單了,即立即數定址!
立即數即指令的一部分,平常我們所看到的程式語言當中:
int a = 5;
這樣我們在棧中儲存了乙個資料5,但是它是有空間的,在彙編中對它定址是這樣的:
比如a在棧中的偏移位址是0x135h
mov ax,[135h]
cpu會到135h的記憶體中根據位寬定址,將值尋回來以後,放入到ax暫存器當中!
立即數不同,立即數是不佔任何空間的,它存在於**段,是指令的一部分:
mov ax,135h
ax內容=135
當這個指令執行完成之後記憶體被釋放掉之後,我們下次想要找到這個記憶體空間是找不到的!
立即定址要快於其它定址,因為它無需進行定址!
間接定址實現
一 實驗目的 鞏固線性表的資料結構的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。二 實驗內容 建立乙個由n個學生成績的順序表,n的大小由自己確定,每乙個學生的成績資訊由自己確定,實現資料的對錶進行插入 刪除 查詢等操作。分別輸出結果。三 源 五 實驗心得 間接定址,在網...
立即定址方式
立即定址方式所提供的運算元緊跟在操作碼的後面,與操作碼一起放在指令 段中。立即數可以是8位無符號整數或16位無符號整數,但不可以是小數。如果是16位數,則低位位元組存放在低位址中,高位位元組存放在高位址中。立即定址方式只能用於源運算元字段,不能用於目的運算元字段,經常用於給暫存器賦初值。例 mov ...
間接定址的實現
資料結構 實驗二 線性表綜合實驗 一 實驗目的 鞏固線性表的資料結構的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題 二.實驗內容 1.建立乙個由n個學生成績的順序表,n的大小由自己確定,每乙個學生的成績資訊由自己確定,實現資料的對錶進行插入 刪除 查詢等操作。分別輸出結果...