【问题标题】:What is the difference between these addressing modes...?这些寻址模式有什么区别......?
【发布时间】:2013-02-18 03:02:38
【问题描述】:

寄存器、间接、基数+位移、双间接和 PC 相对之间有什么区别。鉴于它们在某些情况下的使用,我不太确定我是否了解如何区分这些不同的寻址模式。有人可以帮我识别它们之间的区别吗?

【问题讨论】:

  • The Wikipedia article 关于该主题的内容非常广泛,您应该看看!
  • 请澄清您的问题。您提到一个相当广泛的寻址模式列表的事实可能暗示您不了解寻址本身的目的。您可能知道,寻址模式只是定义特定操作集的约定,这些操作将用于计算[某些操作,如读取、写入、比较等]的有效地址。因此,人们可能会对与特定模式相关的特定“机械”计算感到困惑,或者可能想知道哪个特定用例会使给定模式有用,或者可能......
  • (续)...人们可能想知道性能方面的考虑,但询问“这些 [相对不相关的] 寻址模式之间的差异”是一个相当开放的问题。
  • 我只是要求语法差异,我对它们的如何操作并不特别感兴趣。我知道这可能听起来令人困惑,但我只是想知道,显示一些说明,如何确定它代表上述哪种寻址模式。
  • 响应对于不同的 CPU 也会有所不同(实际上是不同的汇编器,因为某些约定可能是特定于汇编器的)。您使用的是哪个 CPU 系列? x86?

标签: assembly addressing-mode


【解决方案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 会将表示为 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2014-06-22
    • 2019-11-05
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多