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

how does str/ldr knows the register size?

aarch64 使用 str/ldr 将 store/load 注册到内存中:

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

上面的例子中,q0/q1是128bit,x1/x0是64bit,但是str/ldp怎么知道当前寄存器的大小呢?与word size有关吗?

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

完全像 str x0, [dst] vs. str w0, [dst] vs. strb w0, [dst]:所有 3 assemble 到不同的操作码,这意味着不同的存储大小。

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

(选择的动机是缺少其他将通用寄存器视为 8 位或 16 位的指令,就像在 x86 上那样。如果你有一整套 addbshlb 指令,汇编语言的设计者可能会编写一个字节寄存器名称,如 x0bb0 或类似的名称,并将它们与助记符一起使用,如 addstr . 同样,这有点像 x86 为其“部分寄存器”指令所做的。然而,m68k 对大多数指令具有 byte/word/long 大小,并且使用 add.b d1, d0 就可以了,而不需要弥补部分寄存器的名称。像 ARM 但与 x86 不同,m68k 无法访问像 x86 的 AH 这样的寄存器的第二个字节,所以这可能是激发 x86's partial-register naming.)

的真正因素
  • load/store的大小由source/destination寄存器名决定
  • 指令可以加后缀以强制使用更小的load/store尺寸