2014-07-18 88 views
1

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

我给出的下列指令:

mov 3[R2+], 0x100 

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

这个问题问一个重写只有在处置以下寻址模式指令:

  • rx寄存器直接
  • [rx]寄存器间接
  • #立即寻址

我可以使用说明add,submov

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

这些都说明:

add r2, #3 

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

下一个指令是:

mov r1, #0x100 

我理解。

mov [r2],[r1] 

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

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

最后的指令

sub r2, #2 

再次我不知道为什么r2使用,而不是[r2]。我希望有人能为我澄清这一点。

+0

*“为什么你必须在这里使用直接寻址模式?” - - 你是什么意思?我们想要安排将常量'3'存储在寄存器'r2'中;这就是你如何做到的。你会做什么其他方式? –

+0

*“但我不明白这条指令。”* - 你不明白什么?你明白这个指令的效果是什么吗?如果没有,请阅读架构指导手册 - 它会告诉您每条指令的意义和含义。 –

+1

mov [r2],[r1]看起来不对。另外,你的练习中没有线索 - 至少没有你提到过 - 为什么0x100需要首先加载到另一个寄存器中,然后才将它移到r2指向的地址,而不是执行mov [r2],#0x100 –

回答

2

注册直接在add r2, #3使用,因为一个要加3的值在R2 在其地址是R2中的内存添加三个的值。向r2中的值加上3会产生一个新的地址,这个地址可以被稍后的寄存器间接操作使用。直接寻址

注册只需检索寄存器(不是寄存器的地址)。它可能有助于想象系统使用从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不),要获取内存中指针(地址)指向的值,正如你猜测的那样,首先需要将指针加载到寄存器中。

+0

非常感谢为你的答案。但有一件事我不明白。你说'mov [r2],[r1]'拷贝了地址在r1中的内存位置的值。为什么[r1]在内存中获取实际值,但[r2]只能获得[r2]中的地址,而不是驻留在内存中的某个实际值? – eager2learn

+0

@ eager2learn在这两种情况下,'[rX]'表示法都用于指示操作数在内存中的位置。对于被读取的操作数(源操作数),这将返回该位置的值;对于写入的操作数(目标操作数),此*将覆盖*该位置处的值。 –