在装配说明中寻址模式

时间:2014-07-18 16:36:38

标签: assembly cpu-registers computer-architecture

我有一些关于在Assembly中解决模式的基本问题。

我给了以下指示:

mov 3[R2+], 0x100

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

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

  • rx直接注册
  • [rx]注册间接
  • #立即致辞

我可以使用说明addsubmov

我已经有了解决方案,但不了解其中的一些步骤。

这些是说明:

add r2, #3

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

下一条指令是:

mov r1, #0x100

我理解。

mov [r2],[r1]
但是,我不明白这条指令。根据我的理解[r2]是内存位置的地址。但为什么在第二个操作数上使用间接寻址? R1包含地址0x100。那么我是否使用[r1]得到存储在位置0x100的内存中的值?

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

最后一条指令是

[r3]

我再次确定为什么sub r2, #2 被使用而不是r2。我希望有人能为我澄清一下。

1 个答案:

答案 0 :(得分:2)

add r2, #3中使用了注册直接,因为想要在r2 中的值中添加3而不是在地址为r2的内存中添加三个值。在r2中为值添加3会产生一个新地址,以后的寄存器间接操作可以使用该地址。

寄存器直接寻址只检索寄存器中的(不是寄存器的地址)。 可能有助于想象系统在内存中使用字寻址和映射寄存器从0x00开始,然后add r2, #3将等同于add [0x02], #3(在内存中加3值)在地址0x02处,这是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不提供),要获取内存中指针(地址)指向的值,如你所推测的那样,首先将指针加载到寄存器中是必要的。