GCC内联汇编常见陷阱

本文介绍了GCC内联汇编的使用,包括输出部、输入部和损坏部的详细解释,通过举例说明如何在Linux内核代码中正确处理变量和寄存器。文章还提到了`arch_local_irq_save()`函数的实现,并探讨了如何增强代码可读性。最后,预告了《奔跑吧Linux内核》第二版的相关出版信息。
摘要由CSDN通过智能技术生成

欢迎关注微信公众号:[奔跑吧linux社区]

本文节选自《奔跑吧Linux内核》第二版卷1第1.5章

在Linux内核代码中常常会使用到GCC内联汇编,GCC内联汇编的格式如下。

__asm__ __volatile__(指令部: 输出部: 输入部: 损坏部)

GCC内联汇编在处理变量和寄存器的问题上提供了一个模板和一些约束条件。

  1. 在指令部(AssemblerTemplate)中数字前加上%,如%0、%1 等,表示需要使用寄存器的样板操作数。若指令部用到了几个不同的操作数,就说明有几个变量需要和寄存器结合。

  2. 指令部后面的输出部(OutputOperands)用于描述在指令部中可以修改的C语言变量以及约束条件。每个输出约束(constraint)通常以“=”或者“+”号开头,然后是一个字母(表示对操作数类型的说明),接着是关于变量结合的约束。输出部可以是空的。“=”号表示被修饰的操作数只具有可写属性,“+”号表示被修饰的操作数只具有可读可写属性。

  3. 输入部(InputOperands)用来描述在指令部只能读取的C语言变量以及约束条件。输入部描述的参数只有只读属性,不要试图修改输入部的参数内容,因为GCC编译器假定输入部的参数内容在内嵌汇编之前和之后都是一致的。在输入部中不能使用“=”或者“+”约束条件࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值