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 上那样。如果你有一整套 addb
和 shlb
指令,汇编语言的设计者可能会编写一个字节寄存器名称,如 x0b
或 b0
或类似的名称,并将它们与助记符一起使用,如 add
和 str
. 同样,这有点像 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尺寸
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 上那样。如果你有一整套 addb
和 shlb
指令,汇编语言的设计者可能会编写一个字节寄存器名称,如 x0b
或 b0
或类似的名称,并将它们与助记符一起使用,如 add
和 str
. 同样,这有点像 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尺寸