GCC 内嵌汇编之基本行内汇编

Linux 操作系统内核代码绝大部分使用 C 语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。 GCC 提供了内嵌汇编的功能,可以在 C 代码中直接内嵌汇编语言语句,大大方便了程序设计。

基本行内汇编

基本行内汇编很容易理解,一般是按照下面的格式:

asm(“statements”);

同时“asm”也可以由“__asm__”来代替,“asm”是“__asm__”的别名。在“asm”后面有时也会加上“__volatile__”表示编译器不要优化代码,后面的指令保留原样,“volatile”是它的别名,再后面括号里面的便是汇编指令。

例如:

__asm__ __volatile__("hlt");

如果有很多行汇编,则每一行后要加上“\n\t”

例如:

asm( "pushl %eax\n\t"
"movl $0,%eax\n\t"
"popl %eax");

实际上 gcc 在处理汇编时,是要把 asm(…)的内容“打印”到汇编文件中,所以格式控

制字符是必要的。

再例如:

asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);

在上面的例子中,由于我们在行内汇编中改变了 edx 和 ebx 的值,但是由于 gcc 的特殊

的处理方法,即先形成汇编文件,再交给 GAS 去汇编,所以 GAS 并不知道我们已经改变了edx 和 ebx 的值,如果程序的上下文需要 edx 或 ebx 作暂存,这样就会引起严重的后果。对于变量_booga 也存在一样的问题。为了解决这个问题,就要用到扩展的行内汇编语法。

转载于:https://www.cnblogs.com/xiaojianliu/articles/8735303.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值