clobber的正确使用方法是:如果inline assemble代码使用了没有被初始化地声明为输入值或者输出值的任何其他寄存器,则要通知编译器,编译器必须知道这些寄存器,以便避免使用它们。

看一个例子:

#include <stdio.h>

int main(int argc, char **argv)

{

int data = 10;

int result = 20;

__asm__ __volatile__ ( ".text           /n/t"

"movl %1, %%eax /n/t"

"addl %%eax, %0 /n/t"

: "+r" (result)

: "r"  (data)

: "eax");

printf("data = %d/nresult = result + data = %d/n", data, result);

return 0;

}

在这个例子中,inline assemble代码将%eax用作存储中间数据。因为这个寄存器没有被声明为输入值或者输出值,所以必须在clobber中包含它。

现在编译器知道%eax不可用,它会避免使用这个寄存器。使用constraint "r"声明输入值,"+r"声明输出值,这使编译器能够选择要使用的寄存器。查看生成的汇编语言代码,可以发现选择了哪些寄存器:

movl    $10, 24(%esp)

movl    $20, 28(%esp)

movl    24(%esp), %ecx /* data使用%ecx */

movl    28(%esp), %eax /* 编译器正确地避免使用%eax,因为在inline assemble代码中声明了要使用它 */

movl    %eax, %edx /* result使用%edx寄存器 */

#APP

# 9 "clobber_test.c" 1

.text

movl %ecx, %eax

addl %eax, %edx

# 0 "" 2

#NO_APP

movl    %edx, 28(%esp)

*NOTE*

CLOBBER有个奇怪的地方:如果在inline assemble之内使用了没有在输入值或者输出值中定义的任何内存位置,那它必须被标记为

“被迫坏的“。在clobber中使用"memory"这个词通知编译器这个内存位置在inline assemble代码中被破坏!!!!!!

正确使用GCC inline assemble 中的 clobber相关推荐

  1. GCC Inline ASM GCC内联汇编

    GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码 ...

  2. ARM GCC Inline Assembler Cookbook

    http://www.ethernut.de/en/documents/arm-inline-asm.html  (原文链接) ARM GCC Inline Assembler Cookbook Ab ...

  3. 【错误记录】Android 注解处理器报错 ( 非法的类文件开始 , 请删除该文件或确保该文件位于正确的类路径子目录中。 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Android APT , 使用 注解处理器 生成 Java 代码 , 报如下错误 ; 错误: 无法访问MainActivity_ViewBinde ...

  4. Android Studio运行报错:无法访问XXX......请删除该文件或确保该文件位于正确的类路径子目录中

    今天运行一个项目发现运行不起来了,报错 错误: 无法访问XXX 错误的类文件: C:\Users\xxx\.gradle\caches\transforms-2\files-2.1\xxx\xxx(x ...

  5. html调用mysql数据库表里值,如何从MYSQL数据库正确调用行到HTML表中

    我有一个表格,用户填写信息添加到MySQL表中.如何从MYSQL数据库正确调用行到HTML表中 现在,当我尝试显示表我得到 ID Name Phone - - - 一个非常薄的线表头下出现的.我检查了 ...

  6. 如何正确地在vm虚拟机中安装Linux 显卡

    VM虚拟机里面的显卡,是虚拟出来的硬件,根本就不是物理显卡,所以,只能用跟VM显卡对应的驱动.至于VM显卡的驱动,绝大部分Linux系统都自带了这个驱动,可以去硬件列表看看能否识别. 安装Vmware ...

  7. 关于GCC/LLVM编译器中的sanitize选项用处用法详解

    关于GCC/LLVM编译器中的sanitize选项用处用法详解 ​ 编译器中sanitize选项原本来自google的开源C/C+ +工具集sanitizers项目, 包括了AddressSaniti ...

  8. IDEA运行报错:类文件具有错误的版本 55.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。

    IDEA运行报错:类文件具有错误的版本 55.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中. 如果搜索资料,会看到minor.major版本,但其实不叫这个名字.Sun公司会 ...

  9. SpringBoot项目启动报错[类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。]

    Web server failed to start. Port 80 was already in use. Web server failed to start. Port 80 was alre ...

最新文章

  1. Ural 1018 (树形DP+背包+优化)
  2. Windows Server Backup 备份活动目录
  3. BLE-NRF51822教程6-创建一个自己的服务
  4. NDK 开发实战 - 封装 java 层 sdk 模型
  5. vue中选项和url根据彼此的改变实现高亮显示
  6. 贺利坚老师汇编课程29笔记:在代码段使用栈将程序定义的数据逆序
  7. (转)SQL Server当中生成一定范围的随机数
  8. java修改文件后缀_java批量修改文件后缀的方法介绍
  9. 信息流广告 html5,做信息流广告怎么找关键词?
  10. 《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)(精)
  11. html5橡皮擦,HTML5 Canvas笔记——实现橡皮擦功能,包括矩形擦和圆形擦。
  12. MATLAB安装摄像头插件
  13. 一些最最基本的几何图形公式
  14. 基本表改变视图不改变为什么_为什么说10万本金以下穷人玩股票一般都会赔?不改变穷人思维,还不如退出股市...
  15. 易语言程序c盘路径,易语言取文件路径的操作教程
  16. 原版win7 install.wim在哪?
  17. c ref java_使用JNA将C数组返回给Java
  18. java游戏 暴雨梨花,《梦幻西游》新足迹暴雨梨花和踩浪花游戏效果
  19. 配置别名 配置alias
  20. matlab错误使用meshline47,matlab里mesh出错Z 必须为矩阵,不能是标量或矢量怎么解决...

热门文章

  1. Vue组件传值——兄弟组件传值
  2. spring data jpa 执行sql
  3. 【Unity开发小技巧】模型单指旋转双指缩放功能代码(多种情况)
  4. 国际首例人造单染色体真核细胞创建成功,中国实现合成生物学里程碑式突破...
  5. interrupt using
  6. 打开计算机无法最小化,电脑最小化窗口后无法在任务栏中显示怎么解决
  7. 全差分运算放大器ADA4930的分析(1)
  8. 用户模块跳转、sso单点登录、跨域访问
  9. 俄罗斯套娃程序java_原创(俄罗斯套娃程序) | 学步园
  10. U盘被识别为其他设备(显示U盘图标但是不显示盘符)的解决办法