Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编指令的寻址方式_Assembly_Cpu Registers_Computer Architecture - Fatal编程技术网

Assembly 汇编指令的寻址方式

Assembly 汇编指令的寻址方式,assembly,cpu-registers,computer-architecture,Assembly,Cpu Registers,Computer Architecture,我有一些关于汇编中寻址模式的基本问题 我得到以下指示: mov 3[R2+], 0x100 ,其中,在索引寻址模式下给出的第一个操作数是目标,在内存直接模式下给出的第二个操作数是源 此问题要求重写此指令,但只能使用以下寻址模式: rx直接注册 [rx]寄存器间接 #即时寻址 我可以使用说明add、sub和mov 我已经有了解决方案,但不了解其中的一些步骤 以下是说明: add r2, #3 为什么您必须在这里使用直接寻址模式而不是[r2]?据我所知,对于间接寻址,操作数是寄存器的地址,其

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

我得到以下指示:

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位置的值

I常规如果我想获得一个包含地址的寄存器
rx
的值,我可以使用类似
[rx]
的表达式获得该值吗?如何获取存储在位置
[r2]
中的值?在这种情况下,是否有直接的方法获取值,或者我必须先将内容(即r2中包含的地址)写入另一个寄存器,比如
r3
,然后使用
[r3]
获取实际值

最后一条指令是

sub r2, #2

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

Register direct用于
add r2,#3
,因为人们希望在r2中的值上加3,而不是在地址在r2中的内存中加3。将3添加到r2中的值会生成一个新地址,该地址可供以后的寄存器间接操作使用

寄存器直接寻址只检索寄存器中的值(而不是寄存器的地址)。想象一下,系统从0x00开始在内存中使用字寻址和映射寄存器,然后
添加r2,#3
将等同于
添加[0x02],#3
(将3添加到内存中地址0x02处的值,即r2的地址)和
添加[r2],#3
将等同于
添加[0x02],#3
(即双间接)。(为绝对内存寻址选择的语法只是使用一个空数字,用前缀
#
表示立即数,这似乎令人困惑。我对这两种形式的内存寻址都使用了方括号。)

mov[r2],[r1]
将地址在r1中的内存位置中的值复制到地址在r2中的内存位置。由于r1刚刚加载了值0x100,这相当于
mov[r2],[0x100]
(或者
mov[r2],0x100
,在为练习选择的混乱语法中)。但是,“mov[r2],[0x100]”将使用不受支持的寻址模式


如果没有提供内存间接寻址(VAX,一种非常CISCy的ISA,如果这样的话;Renesas RX,一种现代的CISC,则不提供),要获得内存中指针(地址)指向的值,必须首先将指针加载到寄存器中,正如您猜测的那样。

“为什么这里必须使用直接寻址模式?”-什么意思?我们希望将常数
3
存储在寄存器
r2
中;你就是这样做的。你还有什么别的办法吗?“不过,我不懂这个说明。”-你不懂什么?你知道那个指令的效果是什么吗?如果没有,请阅读该体系结构的说明手册——它会告诉您每个说明的效果和意义。mov[r2],[r1]看起来是错误的。此外,在您的练习中没有任何线索-至少您没有提到-为什么需要先将0x100加载到另一个寄存器,然后再将其移动到r2指向的地址,而不是执行mov[r2],#0x100非常感谢您的回答。然而,有一件事我不明白。您说,
mov[r2],[r1]
复制地址在r1中的内存位置中的值。为什么[r1]获取内存中的实际值,而[r2]只获取[r2]中的地址,而不获取内存中的某个实际值?在这两种情况下,
[rX]
符号用于指示操作数在内存中的位置。对于读取的操作数(源操作数),返回该位置的值;对于写入的操作数(目标操作数),这将覆盖该位置的值。