繁体   English   中英

汇编说明中的寻址模式

[英]Addressing modes on assembly instructions

我对汇编中的寻址方式有一些基本问题。

我得到以下指示:

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中包含的地址)写入另一个注册说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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM