簡體   English   中英

這些尋址模式之間有什么區別...?

[英]What is the difference between these addressing modes...?

寄存器、間接、基數+位移、雙重間接和 PC 相對之間有什么區別。 鑒於它們在某些情況下的使用,我不太確定我是否理解如何區分這些不同的尋址模式。 有人可以幫我識別它們之間的區別嗎?

在語法上,在匯編代碼層面,尋址方式是由多種因素決定的……

  • 使用的 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會將表示為 16 位整數的值 99 移動到 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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM