2013-02-18 55 views
2

寄存器,間接,基本+位移,雙重間接和PC相對之間有什麼區別。我不太確定我瞭解如何區分這些不同的尋址模式,並在某些情況下使用它們。有人能幫我認識他們之間的區別嗎?這些尋址模式有什麼區別...?

+3

[關於該主題的維基百科文章](http://en.wikipedia.org/wiki/Addressing_mode)相當廣泛,你應該看看! – 2013-02-18 03:12:25

+0

請說明你的問題。你提到一個相當廣泛的尋址模式列表可能暗示你不瞭解自己尋址的目的。正如你可能知道的那樣,尋址模式僅僅是一些約定,它們定義了將用於計算[讀取,寫入,比較等一些動作的有效地址]的一組特定操作。因此,人們可能會被與特定模式相關的特定「機械」計算混淆,或者人們可能想知道哪個特定的用例會使給定模式有用,或者可能... – mjv 2013-02-18 03:59:04

+0

(續)......可能有人想知道性能方面的考慮,但要求「這些[相對不相關的]尋址模式之間的區別」是一個相當懸而未決的問題。 – mjv 2013-02-18 04:00:33

回答

1

在語法上,在彙編代碼的電平,尋址模式由多個因素決定...

  • 使用的OP代碼(例如,一些操作使用隱含特定寄存器或尋址模式)
  • 操作數:是這些引用到寄存器,以存儲或立即值
  • 一些指令,如在字節指令如在MOV DWORD PTR ...

操作數和圍繞它們的語法通常與確定尋址模式有關。這可以用x86 MOV操作來說明,因爲相同或非常類似的語法適用於x86系列CPU上的其他操作。類似的語法和規則適用於其他處理器,但當然體系結構上的差異(例如寄存器的列表和角色)以及其他差異使得以下相對x86特定的不同。
MOV具有將第二個參數引用的數據複製到第一個參數引用的位置的效果。有關於這些文獻的性質許多可能的組合:

MOV <reg>, <reg>  ; register to register 
MOV <reg>, <mem>  ; memory to register 
MOV <mem>, <reg>  ; register to memory 
MOV <reg>, <const> ; immediate value to register 
MOV <mem>, <const> ; immediate value to memory 

此外,這些引用可能是間接的,當相應的操作數是在括號內。例如,MOV WORD PTR [ebx], 99將把值99(以16位整數表示)移動到EBX寄存器指向的存儲器位置。

而且,括號中的間接存儲位置可以表示爲簡單的算術表達式,例如MOV [esi+eax], dl。這裏寄存器DL中的字節被複制到通過添加ESI和EAX寄存器的內容找到的存儲器位置。請注意,這需要不只是兩個寄存器,它也可能是像[esi + 8*ebx][esi - 16]

表達與所有考慮到這一點,這裏的MOV操作的上下文中的幾個例子:

MOV eax, [edx] ; Copies 4 bytes in memory at the address contained in EDX 
       ; into EAX the size (4bytes) is implied by the size of EAX. 

MOV [MyVar], ebx ; Copies the contents of EBX into the 4 bytes at memory address 
       ; MyVar. (Assumes MyVar is a 32-bit constant). 

MOV eax, [esi-4] ; Copies 4 bytes at memory address ESI -4 into EAX 

MOV [esi+eax], bl ; Copies the contents of BL (one byte) into the byte at address 
        ; ESI+EAX 

MOV BYTE PTR [MyVar], 123 ; Copies the (decimal) value 123 coded as an 8 bits 
          ; to the memory address contained by MyVar. 
          ; Here the size directive (BYTE PTR) is necessary.