【问题标题】:Addressing modes on assembly instructions汇编指令的寻址模式
【发布时间】:2014-09-10 02:11:09
【问题描述】:

我有一些关于汇编中寻址模式的基本问题。

我得到以下指示:

mov 3[R2+], 0x100

,其中第一个操作数,以索引寻址模式给出,是目标,第二个,以内存直接模式给出,是源。

问题要求人们重写这条指令,只有以下寻址模式可供使用:

  • rx直接注册
  • [rx]间接注册
  • # 立即寻址

我可以使用指令addsubmov

我已经有了解决方案,但有些步骤不明白。

这些是说明:

add r2, #3

为什么你必须在这里使用直接寻址模式而不是[r2]?据我了解,间接寻址操作数是寄存器的地址,其内容是包含实际值的内存位置的地址。因此,如果我将 3 添加到 r2,我会得到一个指向不同寄存器的地址,不是吗?但我真正想要的是位于地址为 3 + 地址的前一个值的内存位置的值。有人可以向我解释一下吗?

下一条指令是:

mov r1, #0x100

我明白了。

mov [r2],[r1]

但是,我不明白这个说明。据我了解[r2] 是内存位置的地址。但是为什么在第二个操作数上使用间接寻址呢? R1 包括地址 0x100。那么我是否可以使用[r1] 获取存储在内存中位置 0x100 的值?

我一般来说,如果我想获得一个包含地址的寄存器rx 的值,我可以使用[rx] 之类的表达式来获取该值吗?我如何获得例如的价值在这种情况下,存储在位置[r2] 中的值是否有直接获取该值的方法,或者我是否必须先将内容(即r2 中包含的地址)写入另一个寄存器,例如r3,然后使用[r3]获取实际值?

最后一条指令是

sub r2, #2

我再次不确定为什么使用r2 而不是[r2]。我希望有人可以为我澄清这一点。

【问题讨论】:

  • “这里为什么要使用直接寻址方式?” - 你什么意思?我们要安排常量3存储在寄存器r2中;你就是这样做的。你还有什么办法呢?
  • “但是我不明白这个指令。” - 你不明白什么?你明白那个指令的效果是什么吗?如果没有,请阅读架构的说明手册——它会告诉您每条指令的功能和含义。
  • mov [r2],[r1] 看起来不对。另外,您的练习中没有任何线索-至少您没有提到-为什么需要先将 0x100 加载到另一个寄存器中,然后再将其移动到 r2 指向的地址,而不是执行 mov [r2], #0x100

标签: assembly cpu-registers computer-architecture


【解决方案1】:

add r2, #3 中使用直接寄存器,因为想要将 r2 中的值加 3 将地址在 r2 中的内存中的值加 3。将 3 加到 r2 中的值会产生一个新地址,供以后的寄存器间接操作使用。

寄存器直接寻址只是检索寄存器中的(不是寄存器的地址)。 可能可以帮助想象系统在内存中从 0x00 开始使用字寻址和映射寄存器,那么add r2, #3 将等价于add [0x02], #3(将内存中地址 0x02 处的值加 3,这是r2的地址)和add [r2], #3将等效于add [[0x02]], #3(即双重间接)。 (为绝对内存寻址选择的语法——只使用一个裸数字,用前缀 # 表示立即数——似乎令人困惑。我对两种形式的内存寻址都使用了方括号。)

mov [r2], [r1] 将地址在 r1 的内存位置的值复制到地址在 r2 的内存位置。由于 r1 刚刚加载了值 0x100,因此这等效于 mov [r2], [0x100](或为练习选择的令人困惑的语法中的 mov [r2], 0x100)。但是 'mov [r2], [0x100]` 将使用不受支持的寻址模式。

如果没有提供内存间接寻址(VAX,一个非常 CISCy 的 ISA,提供了这个;Renesas RX,一个现代的 CISC,没有),要获取内存中指针(地址)指向的值,它正如您所猜测的那样,首先需要将指针加载到寄存器中。

【讨论】:

  • 非常感谢您的回答。然而,有一件事我不明白。你说mov [r2], [r1] 将值复制到地址在r1 中的内存位置。为什么[r1]获取的是内存中的实际值,而[r2]获取的只是[r2]中的地址,而不是内存中的某个实际值?
  • @eager2learn 在这两种情况下,[rX] 符号用于指示操作数在内存中的位置。对于读取的操作数(源操作数),这将返回该位置的值;对于写入的操作数(目标操作数),这覆盖该位置的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多