我有一些有关汇编中寻址模式的基本问题。
我得到以下指示:
mov 3[R2+], 0x100
,其中在索引寻址模式下给出的第一个操作数是目标,而在内存直接模式下给出的第二个操作数是源。
这个问题要求人们重写只有以下几种寻址方式的指令:
rx
直接注册[rx]
间接注册#
立即寻址我可以使用的指令add
,sub
和mov
。
我已经有了解决方案,但是不了解其中一些步骤。
这些是说明:
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]
。我希望有人可以为我澄清这一点。
使用直接寄存器是add r2, #3
因为要在r2中的值上加3,而不是在r2中的地址中的值上加3。r2中的值加3会产生一个新地址,以后的寄存器间接操作可以使用该地址。
寄存器直接寻址只是检索寄存器中的值(而不是寄存器的地址)。它可能有助于想象系统中使用的字寻址并且被映射在存储寄存器开始0×00,然后add r2, #3
将相当于add [0x02], #3
(地址0×02在存储器加入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;没有提供此功能,那么瑞萨电子公司的RX,它是现代的CISC,则没有),以获取由内存中的指针(地址)指向的值。推测,首先将指针加载到寄存器中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句