gpt4 book ai didi

assembly - RISC-V 汇编语法中的混合目标/源操作数顺序

转载 作者:行者123 更新时间:2023-12-04 18:18:07 30 4
gpt4 key购买 nike

RISC-V 汇编器中的大多数指令在源操作数之前对目标操作数进行排序,例如:

li  t0, 22        # destination, source
li t1, 1 # destination, source
add t2, t0, t1 # destination, source

但是商店说明的顺序颠倒了:
sb    t0, (sp)    # source, destination
lw t1, (a0) # destination, source
vlb.v v4, (a1) # destination, source
vsb.v v5, (a2) # source, destination

怎么来的?

这种(可以说是)非对称汇编器语法设计的动机是什么?

最佳答案

当涉及到目标操作数和源操作数时,我没有看到 RISC-V 汇编中真正的不一致:目标操作数——当它是指令编码的一部分时——总是对应于汇编语言中的第一个操作数。

如果我们从六种不同指令格式中的四种中查看以下指令示例:

  • R型:add t0, t1, t2
  • I型:addi t0, t1, 1 1
  • J型:jal ra, off
  • U型:lui t0, 0x12345

  • 在上面的汇编指令中,目标操作数是第一个操作数。显然,这个目标操作数对应于 目标寄存器在指令编码中。

    现在,让我们专注于商店说明(S 型格式)。例如,考虑以下存储指令:
    sw t0, 8(sp)

    我认为很清楚 t0上面是一个源操作数因为存储指令将其内容存储在内存中。

    我们可能会认为 8(sp)是目标操作数。但是,通过仔细查看 S 型指令格式:

    S-type format

    我们可以看出 8(sp)上面汇编指令中的部分实际上不是单个操作数,而是两个操作数,即立即数 8 (即 imm)和源寄存器 sp (即,rs1)。如果指令可以表达为(类似于 addi 2):
    sw t0, sp, 8

    很明显,这条指令需要三个操作数,而不仅仅是两个。

    注册 sp不修改,只读取;因此,它不能被视为目标寄存器。它也是一个源寄存器,就像 t0 is – 存储指令在内存中存储其内容的寄存器。 内存是目标操作数 因为它是接收 t0的内容的.

    S 型指令格式不对目标操作数进行编码。指令编码的是 关于目标操作数的寻址信息 .对于 sw t0, 8(sp) ,目标操作数是内存中 指定的位置处的字有效地址 store 指令根据 sp 计算得出和 8 .注册 sp包含有关内存中该字的寻址信息的一部分(即目标操作数)。

    概括

    RISC-V 中编码目标操作数的汇编指令将此操作数作为第一个。但是,存储指令不会对目标操作数进行编码。它的目标操作数是内存中的一个位置,内存中这个位置的地址是根据指令源操作数的内容计算出来的。

    1我们可能会争辩说 jal ra, off上面的指令有一个额外的目标操作数,即 pc , 因为 pc更新方式如下: pcpc + SignExtension( off )。
    但是,执行任何其他指令也会导致修改 pc ,例如,递增 pc由四个(分支和 jalr 可能不同)。不管怎样, pc没有编码在任何指令中,程序员不能直接访问它作为寄存器。因此,对讨论没有兴趣。出于同样的原因,我还在本次讨论中省略了 B 型格式。

    2或者反过来说:认为你可以表达 addi t0, t0, -1addi t0, -1(t0) .那么你会说 addi吗?需要两个操作数(例如, t0-1(t0) )?

    关于assembly - RISC-V 汇编语法中的混合目标/源操作数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59802318/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com