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位的其他指令。如果你有一整套addb
和shlb
指令,汇编语言的设计者可能会组成一个字节寄存器名,比如x0b
或b0
或其他什么,并将它们与助记符一起使用,比如add
和str
。同样,这将有点像x86为其";部分寄存器";说明书然而,对于大多数指令来说,m68k具有字节/字/长的大小,并且使用add.b d1, d0
可以很好地处理,而不需要为部分寄存器编名称。与ARM一样,但与x86不同,m68k无法像x86的AH那样访问寄存器的第二个字节,因此这可能是促使x86部分寄存器命名的真正因素。(
- 加载/存储的大小由源/目标寄存器名决定
- 指令可以加后缀以强制较小的加载/存储大小