zoukankan      html  css  js  c++  java
  • 转载:GCC inline asm

    From: http://alpha-blog.wanglianghome.org/2011/04/07/gcc-inline-asm/
     

    在使用高级语言编写程序的时候,可以根据需要插入汇编程序,无须另外创建汇编文件。

    在编写inline asm程序时,需要使用asm关键字,并将汇编程序用括号括起来,以分号结尾。格式如下:

    asm(code : output operand list : input operand list : clobber list);

    如果最右侧的部分为空,可以联通相邻的冒号一起省略。最简单的形式是只有指令部分,如:

    asm("mov r0,r0");

    复杂的形式则需要提供参数列表,GCC支持两种方式标注汇编指令参数,老的方式是使用数字,如%0便是第0个操作数,%1表示第一个操作数,以此类推;新的方式支持变量名,如%[result]或者$[value],这个名字和高级语言里面的变量没有任何关系。例子如下:

    asm("vmsr fpscr,%[value]" : : [value] "r" (var));

    或者

    asm("vmsr fpscr, %0" : : "r" (var));

    VMSR是ARM的一条VFP指令,上述汇编指令的意图是将变量var的值保存到FPSCR状态寄存器里面。由于改指令没有输出操作数,所以输出操作数部分为空,但是相应的冒号要保留。下面的例子则只有输出操作数,没有输入操作数和clobber list,在这种情况下,相应的冒号也可以省略。

    asm("vmrs %[result], fpscr" : "=r" (var));

    或者

    asm("vmrs %0, fpscr" : "=r" (var));

    VMRS指令将状态寄存器FPSCR的值保存到变量var里。注意输出操作数要使用”=“。

    更多inline asm的知识,参见ARM GCC Inline Assembler Cookbook

  • 相关阅读:
    (紫书,感谢作者)第7章暴力求解法
    明日更新
    明天更新
    UVa11882最大的数(dfs+剪枝)
    UVa12569树上的机器人的规划
    es6中的reduce方法?
    浏览器是如何渲染页面的?
    判断是不是一个数组?
    判断是否是一个数组?
    var与let的区别?
  • 原文地址:https://www.cnblogs.com/super119/p/2956345.html
Copyright © 2011-2022 走看看