zoukankan      html  css  js  c++  java
  • C语言内嵌汇编代码

    C代码中嵌入汇编语句,常见格式如下:

    asm volatile( /* volatile : 可选,禁止编译器对汇编代码进行优化 */
      "汇编语句模板"   /* 汇编指令间使用'
    '分隔 */
      :"=限制符"(输出参数)
      :"限制符"(输入参数)
      :损坏部分
    )

    其中:

    1、asm表示后面的代码为内嵌汇编;

    2、volatile表示编译器不要优化代码,后面的指令保留原样;

    3、编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC对这些操作有哪些限制条件。

    内嵌汇编格式为——汇编语句模板:输出部分:输入部分:损坏部分

    注意:
    1、内嵌汇编的四个部分(汇编语句模板,输出部分,输入部分,破坏描述部分)使用":"格开;汇编语句模板必不可少,其他三部分可选,如果某一部分为空,也需要用":"格开,相应部分内容为空
    2、汇编语句模板由汇编语句序列组成,语句之间使用";"、" "或" "分开。指令中的操作数可以使用占位符引用C语言变量,操作数占位符最多10个,名称如下:%0,%1,...,%9。指令中使用占位符表示的操作数,总被视为long型(4个字节),但对其施加的操作根据指令可以是字或者字节,当把操作数当作字或者字节使用时,默认为低字或者低字节。对字节操作可以显式的指明是低字节还是次字节。方法是在%和序号之间插入一个字母,"b"代表低字节,"h"代表高字节,例如:%h1。
    3、输出部分描述输出操作数,不同的操作数描述符之间用逗号格开,每个操作数描述符由限定字符串和C 语言变量组成。每个输出操作数的限定字符串必须包含"="表示他是一个输出操作数。

    例:__asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) )
    描述符字符串表示对该变量的限制条件,这样GCC 就可以根据这些条件决定如何分配寄存器,如何产生必要的代码处理指令操作数与C表达式或C变量之间的联系。

    4、输入部分描述输入操作数,不同的操作数描述符之间使用逗号格开,每个操作数描述符由限定字符串和C语言表达式或者C语言变量组成。

    例如:__asm__("btsl %1,%0":"=m" (ADDR):"Ir" (nr));

    第一个占位符%0与C 语言变量ADDR对应,第二个占位符%1与C语言变量nr对应。因此上面的汇编语句代码与下面的伪代码等价:btsl nr, ADDR,将(*addr)的第nr位设为1。

  • 相关阅读:
    Java实现 LeetCode 30 串联所有单词的子串
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 27 移除元素
    字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
  • 原文地址:https://www.cnblogs.com/caidi/p/15161492.html
Copyright © 2011-2022 走看看