【问题标题】:how does str/ldr knows the register size?str/ldr 如何知道寄存器大小?
【发布时间】:2020-11-25 03:40:34
【问题描述】:

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

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

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

【问题讨论】:

  • 这两条指令有不同的编码(在架构参考手册中查找),编码决定了存储的大小。汇编器查看您指定的寄存器以确定要编码的指令。仅仅因为它们具有相同的助记符并不意味着它们具有相同的编码。

标签: assembly arm64 instructions word-size


【解决方案1】:

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

就像str x0, [dst] vs. str w0, [dst] vs. strb w0, [dst]:所有 3 个都组装成不同的操作码,这意味着不同的存储大小。

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

(选择的原因是缺少将通用寄存器视为 8 位或 16 位的其他指令,就像 x86 上的指令一样。如果您有一整套 addbshlb 指令,则汇编语言的设计者可能会改用 x0bb0 之类的字节寄存器名称,并使用带有诸如 addstr 之类的助记符的名称。同样,这有点像 x86 为其“部分寄存器”指令。然而,m68k 对大多数指令都有字节/字/长大小,并且使用add.b d1, d0 就可以了,而不需要为部分寄存器组成名称。与 ARM 一样,但与 x86 不同,m68k 没有办法访问像 x86 的 AH 这样的寄存器的第二个字节,所以这可能是激发x86's partial-register naming 的真正因素。)

【讨论】:

    【解决方案2】:
    • 加载/存储的大小由源/目标寄存器名称决定
    • 指令后缀可以强制更小的加载/存储大小

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2014-09-19
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多