关于内嵌汇编



  • 请问为什么报这个错呢
    0_1560864778032_5b92025b-11f2-42ad-aefd-f0590c373ea2-image.png



  • rpcc 就是一个嵌汇编的例子,可以参考参考



  • 好的 谢谢老师 我知道问题所在了



  • @桑薇 请问老师rpcc嵌汇编的例子在哪里可以找到,我想参考一下!



  • @DBsong 如果你使用了诸如std=c99或者std=c11,那么就不能这样嵌入汇编。
    可以对应的使用std=gnu99来编译



  • @swmore 老师,我看一下汇编的例子,主要想看一下汇编指令,因为我找不到申威26010的指令级手册,如果老师能提供一下,非常感谢!



  • @DBsong 我可以大概的说一下有哪些指令,如果你熟练编写汇编的话。



  • @swmore 不熟练,刚开始准备学习。



  • @DBsong
    从核的汇编指令可以大体分为读、写、整数、浮点、向量三类。
    指令前缀表示数据大类,指令后缀表示数据小类。
    例如ld指令包括ldw, ldl, vldd, vlds, fldd, flds等以“ld”为核心的指令。
    ldl/ldw为读取64和32bit整数,[v]ld[d],[v]ld[s]是向量化读取64和32bit浮点数,[f]ldd和[f]lds是单个读取64和32bit浮点数。
    即:
    没有前缀对应单个整数操作
    前缀为f对应单个浮点数操作(float)
    前缀为v对应向量操作(vector)

    后缀为w对应32bit整数(word)
    后缀为l对应64bit整数(long)
    后缀为s对应32bit浮点(single)
    后缀为d对应64bit浮点(double)

    常见的操作有:
    ld:从LDM/主存读取
    st:向LDM/主存写入
    add/sub/mul/div/ma/ms/nma/nms:加/减/乘/除/乘加/乘减/负乘加/负乘减
    其中整数向量没有乘除乘加类指令
    整数标量没有除法/乘加类指令

    参数格式为:
    ld/st: 操作数, 偏移量(基址寄存器),行为是通过基址寄存器(寄存器号)与偏移量(16位带符号整数常量)相加后形成地址操作数,将地址操作数对应的内存内容读到操作数(寄存器)或者操作数写到对应地址
    add/sub/mul/div:目标寄存器,操作数1,操作数2,行为是将两个操作数运算后写入结果寄存器,减法/除法中操作数1是被减/除数。整数指令支持操作数2为8位常量的情况。
    ma/ms/nma/nms:目标寄存器,操作数1,操作数2,操作数3,行为是前两个操作数相乘,若为负乘加/负乘减则将积取反,然后加上或者减去操作数3。

    指令手册本身保密,这些是通过阅读编译器生成的汇编总结的规律。



  • @swmore 好的,谢谢老师的回答


Log in to reply