• 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。

  • 相关阅读:
    webpack 中级配置
    webpack4学习笔记
    window搭建go环境
    谈谈你对laravel的契约,容器,服务提供者,facades的理解以及他们的关系是什么
    php开发微信公众号踩坑
    腾讯云搭建git服务器
    linux的常用命令
    egg项目部署
    axios的使用记录以及实现上传图片
    SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
  • 原文地址:https://www.cnblogs.com/caidi/p/15161492.html
Copyright © 2020-2023  润新知