内嵌汇编

本文介绍了内嵌汇编在Linux内核中的使用,特别是GCC提供的内嵌汇编功能。文章讲解了AT&T汇编的基础知识,包括操作数前缀、源/目的操作数顺序和标识长度的操作码后缀。然后,详细阐述了GCC内嵌汇编的基本行内汇编和扩展的行内汇编,以及如何将C语言表达式与汇编指令操作数关联。通过例子解析了内嵌汇编的语法和用法,帮助读者理解如何在C代码中使用内嵌汇编来实现特定功能。
摘要由CSDN通过智能技术生成

内嵌汇编

操作系统高级教程上面需要阅读Linux内核0.11的源码,其中在书《Linux内核设计的一书》第2.5节异常处理类中段服务程序挂接的部分,遇到了嵌入在C语言中的汇编代码,之前从来没有学习过汇编,因此记录下。

AT&T基础知识

内嵌汇编使用的是AT&T汇编,所以首先稍微讲解下AT&T的汇编指令的基础知识。

操作数前缀

movl   $8,%eax 
movl   $0xffff,%ebx 
int     $0x80 

看到在AT&T汇编中诸如"%eax"、"%ebx"之类的寄存器名字前都要加上"%";“8”、“0xffff"这样的立即数之前都要加上”$"。

源/目的操作数顺序

在Intel语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在AT&T中,第一个数是源操作数,第二个数是目的操作数。

// INTEL语法
MOV EAX,8 //EAX是目的操作数, 8是源操作数
// AT&T语法
movl   $8,%eax //8是源操作数 EAX是目的操作数

标识长度的操作码后缀

在AT&T的操作码后面有时还会有一个后缀,其含义就是指出操作码的大小。“l”表示长整数(32位),“w”表示字(16位),“b”表示字节(8位)。

movb    %bl,%al
movw   %bx,%ax
movl     %ebx,%eax
movl     (%ebx),%eax

GCC内嵌汇编

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

基本行内汇编

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

asm(“statements”);

在“asm”后面有时也会加上“volatile”表示编译器不要优化代码,后面的指令保留原样

asm volatile(“hlt”);

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

 asm( "pushl %eax\n\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值