我有一些关于在Assembly中解决模式的基本问题。
我给了以下指示:
mov 3[R2+], 0x100
,其中在索引寻址模式中给出的第一个操作数是目标,在内存直接模式中给出的第二个操作数是源。
这个问题要求一个人重写这条指令,只有以下寻址模式可供使用:
rx
直接注册[rx]
注册间接#
立即致辞我可以使用说明add
,sub
和mov
。
我已经有了解决方案,但不了解其中的一些步骤。
这些是说明:
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
。我希望有人能为我澄清一下。
答案 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不提供),要获取内存中指针(地址)指向的值,如你所推测的那样,首先将指针加载到寄存器中是必要的。