str/ldr如何知道寄存器大小



aarch64使用str/ldr将寄存器存储/加载到内存中:

str q0, [dst]
str x0, x1, [dst]

在上面的例子中,q0/q1是128位,x1/x0是64位,但str/ldp如何知道当前寄存器的大小?它与单词大小有关吗?

在asm源中,寄存器名称表示大小
在机器代码中,操作码表示大小。

str x0, [dst]str w0, [dst]strb w0, [dst]完全一样:所有3个都组装到不同的操作码,这意味着不同的存储大小。

其中一些操作码共享str助记符,而另一些则有自己的助记符这一事实纯粹是设计asm源语言的问题,与CPU如何解码和执行它无关。

(这一选择的动机是缺乏像x86上那样将通用寄存器视为8或16位的其他指令。如果你有一整套addbshlb指令,汇编语言的设计者可能会组成一个字节寄存器名,比如x0bb0或其他什么,并将它们与助记符一起使用,比如addstr。同样,这将有点像x86为其";部分寄存器";说明书然而,对于大多数指令来说,m68k具有字节/字/长的大小,并且使用add.b d1, d0可以很好地处理,而不需要为部分寄存器编名称。与ARM一样,但与x86不同,m68k无法像x86的AH那样访问寄存器的第二个字节,因此这可能是促使x86部分寄存器命名的真正因素。(

  • 加载/存储的大小由源/目标寄存器名决定
  • 指令可以加后缀以强制较小的加载/存储大小

最新更新