我要评分文档获取效率文档正确性内容完整性文档易理解0/200提交在线提单论坛求助 代码迁移—内联汇编函数移植 内联汇编移植属于C/C++代码迁移过程中较难的部分,内联汇编移植常用的迁移方法有两种:基于汇编指令方式替换、基于builtin函数替换。指令集手册可参见:x86指令集手册、Arm指令集手册。 表1 内联汇编迁移方法介绍 内联汇编移植迁移方法 方法介绍 图中示例 汇编指令方式替换 以字节序反序为例。找到核心汇编指令,这里是bswap把val值字节反序,也就是: 0x1314 (4884) => 0x3141 (12609)。同样在鲲鹏处理器下也有相应的汇编指令,就是rev,只是使用语法上有所不同,它有两个操作数。结合内联汇编规则,也能够快捷的完成替换移植。 第一个冒号前是“bswap %0”,汇编指令就是bswap,%0表示的是操作数。 第二个冒号前是“=r” (val) ,“=r”表示寄存器约束,并且只可写(之前保存在其中的值将被废弃而被输出值所代替),val为C/C++传递的变量。最后输入操作列表“0” (val),“0”表示匹配约束(使用和输出相同的寄存器,以更高效地使用变量寄存器),val为C/C++传递的变量。 通过x86汇编指令集手册查询bswap指令功能,在arm指令集手册查询类似功能指令rev进行替换。再根据rev指令的操作数规则编写语句,%w表示的是32位寄存器【dst】只是寄存器修饰符,其他类似。 builtin函数替换 找到汇编指令popcnt 。通过x86指令集手册查询popcnt指令,它是统计变量a中的数,用二进制表示时1的个数,如:0111 (7) => result: 3 。了解其功能后再查看是否有相应的builtin函数进行替换。 先对x86下的内联汇编进行解读,“popcnt %1, %0”中的汇编指令为popcnt ,%1、%0分别代表输出和输入的操作数。“cc”表示此次操作可能会影响到标志寄存器。接下来通过x86指令集手册查询popcnt指令,了解其功能后再查看是否有相应的builtin函数进行替换,这样可以在达到较好移植效果的同时提升移植效率。 父主题: C/C++代码迁移典型移植类问题