RISC-V MCU中文社区

【求助】 关于自定义指令在funt3最高位为0即无rd寄存器时为啥还有输出操作数"=r(variable_name)"

发表于 开源蜂鸟E203 2021-10-31 11:32:08
3
1967
1

在前两个自定义指令中,funct3位置都是2(010),即只有第一个源寄存器,无目的寄存器,那么为啥还有第一个冒号:(输出操作数)


而且既然无目的寄存器,说明指令本身只需要输入,无输出,那这个值又来源于何处呢,经测试,zero的值执行完指令之后总是和addr一样

喜欢1
用户评论 (3)
  • 啊这这这

    2021-11-01 15:53:40 啊这这这 1#

    我学习了一下c语言内联汇编的语法,个人理解这里应该这样理解

    .insn r 0x7b 2 1 这些可以看成一个整体,相当于一个指令名(这里funct3和funct7是给处理器处理这条指令用的),而这个指令有三个操作数,一个目的两个源,注意不管funct3是多少,指的都是 是否要发给协处理器或者等待接收协处理返回,但是对于这条指令而言,都是一个输出,两个输入,这也是为啥跳过了%0直接用%1,因为funct3最高位为0说明协处理器不会返回结果,但是这条指令是有输出操作数的,也就是有%0的,只是不用协处理器返回或者返回的数不需要,没意义


  • 啊这这这

    2021-10-31 11:39:35 啊这这这 2#

    还有前两个汇编指令,明明没有输出操作数,按照隐含指定使用 %0 %1 %2 的对应关系,这里为啥直接跳过了%0,用%1代表第一个输入操作数呢,即使没有输出操作数,因为按照胡总嵌入式书上page183说的隐含指定不是顺序依次指定吗,两个输出操作数的话,%0就是第一个输出操作数,%1代表第二个输出操作数,%2代表第一个输入操作数,按照这个逻辑,没有输出操作数的话,%0不应该代表第一个输入操作数吗

  • 啊这这这

    2021-10-31 11:34:43 啊这这这 3#

    我的猜测是因为内联汇编的格式要求第一个冒号是输出操作数指定,第二个冒号是输入操作数指定,第三个冒号是可能影响寄存器指定,所以必须要有第一个冒号,只是为了给冒号编号,这句"=r(zero)"本身不起任何作用,也没有任何额外意义

啊这这这

啊这这这 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板