GCC编译器技巧--在C语言里面使用使用内敛汇编

GCC内敛汇编

基本格式

asm(汇编语句
:输出操作数(可选)
:输入操作数(可选)
:被破坏的寄存器(可选)
);
  • 示例
int a = 10, b;
asm("movl %1, %%eax; movl %%eax, %0;"
   :"=r"(b)		/*输出*/
   :"r"(a)		/*输入*/
   :"%eax"		/*破坏的寄存器*/
   )

实现的是b=a的功能

具体格式说明

  • 只有一条汇编语句
asm("hlt")		//CPU进行休眠
  • 多条汇编(需要分隔符)
asm("sti;hlt");
asm("sti\n\thlt");
asm("sti\n\t"
	"hlt");

多条语句的时候使用\n\t或者使用;进行分割

  • 有输出操作数

有些时候有的数据需要将数据输出到C语言里面的某一些变量里面, 可以使用输出操作数

char c;
asm("mov $3, %[out]":[out]"=r"(c));

%[out]是定义的一个输出约束, 名称和后面的out相同, "=r"©则指定了c变量映射到某一个寄存器

  • r: 任意寄存器
  • a: %eax, %ax, %al
  • b:
  • c:
  • d:
  • S: %esi, %si
  • D: %edi, %di
  • 有输入操作数

当需要从C语言中读取变量的值到汇编语句中时,则需要使用输入操作数。例如,下面的代码中,mov %[ch], %%al用于将c变量中的字符写到al中。因此,在输入操作数中使用了[ch]"r"©,即c变量映射到某个寄存器上(见上文中输出操作数的类似设置)。最终的效果为: mov$0xe,%%ah、mov %[c], %%al

char c = 'a';
asm("mov $0xe, %%ah\n\t"
   "mov %[ch], %%al\n\t"
    "int $0x10"::[ch]"r"(c));

在这个时候所有的寄存器前面使用的是%%

  • 参数保存在内存里面
asm("sidt %0\n" 
    : 
    :"m"(loc)
);

这条语句将 IDTR 寄存器的值,保存在内存位置 loc 处。

  • 匹配约束符(数字)

一个变量既要当做输入操作数又要当做输出操作数。这种情况下,在 asm 中使用匹配约束来指定。

asm ("incl %0" 
     :"=a"(var)
     :"0"(var)
);

寄存器 %eax 既用来保存输入操作数,也用来保存输出操作数。输入变量 var 被存进 %eax,在 %eax 中完成自增。“0” 在这里表示与第 0 号输入操作数有相同的约束(既 “a”

  • 从一个变量读取输入,修改后结果存进同一个变量的情况
  • 输入操作数和输出操作数没必要分开的情况。

避免优化

使用__asm__ __volatile__代替原来的asm

相关推荐

  1. GCC编译器技巧--C语言里面使用使用汇编

    2024-02-10 14:14:02       24 阅读
  2. 【Linux】编译器-gcc/g++使用

    2024-02-10 14:14:02       22 阅读
  3. c语言gcc编译动态库静态库和使用说明

    2024-02-10 14:14:02       11 阅读
  4. C语言联合体(Union)实战中的使用技巧

    2024-02-10 14:14:02       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-10 14:14:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-10 14:14:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-10 14:14:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-10 14:14:02       18 阅读

热门阅读

  1. RuoYi模块功能分析:第二章 日志

    2024-02-10 14:14:02       26 阅读
  2. C#系列-C#访问hadoop API(9)

    2024-02-10 14:14:02       34 阅读
  3. 11.1 OpenGL可编程顶点处理:顶点着色器

    2024-02-10 14:14:02       38 阅读
  4. 基础算法-高精度加法 基础算法-高精度加法

    2024-02-10 14:14:02       26 阅读
  5. ubuntu如何离线安装nginx?

    2024-02-10 14:14:02       35 阅读
  6. SIMD学习笔记1

    2024-02-10 14:14:02       26 阅读
  7. Python编程:17个提升工作效率的自动化脚本

    2024-02-10 14:14:02       28 阅读
  8. MATLAB实现随机森林回归算法

    2024-02-10 14:14:02       35 阅读
  9. 力扣-137. 只出现一次的数字 II

    2024-02-10 14:14:02       38 阅读