[英]Addressing modes on assembly instructions
我对汇编中的寻址方式有一些基本问题。
我得到以下指示:
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中包含的地址)写入另一个注册说r3
,然后使用[r3]
来获取实际值?
最后一条指令是
sub r2, #2
同样,我不确定为什么要使用r2
而不是[r2]
。 我希望有人可以为我澄清这一点。
寄存器直接用于add r2, #3
因为要在r2中的值上加3,而不是在地址位于r2中的存储器中的值上加三。 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,但没有),以获得由内存中的指针(地址)指向的值,根据您的推测,首先将指针加载到寄存器中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.