<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->
gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇 编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc 的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内 嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。 写这篇文章的主要信息来源是GNU的两个info文件:as.info和gcc.info,如果你觉得这篇文章中的介绍还不够详细的话,你可以查 阅这两个文件。当然,直接查阅这两个文件可以获得更加权威的信息。 如果你不想被这两篇文档中的一大堆信息搞迷糊的话,我建议你先阅 读一下这篇文章,然后在必要时再去查阅更权威的信息。 二.简介 在Linux的核心代码中,还是存在相当一部分的汇编语言代码。如果你想顺利阅读Linux代码的话,你不可能绕过这一部分代码。在Linux使用的汇编语言代码中,主要有两种格式:一种是直接写成汇编语言 源程序的形式,这一部分主要是一些Linux的启动代码;另一部分则 是利用gcc的内嵌式汇编语言语句asm嵌在Linux的C语言代码中的。这 篇文章主要是介绍第二种形式的汇编语言代码。 首先,我介绍一下as支持的汇编语言的语法格式。大家知道,我们现在学习的汇编语言的格式主要是Intel风格的,而在Linux的核心代码中使用的则是AT&T格式的汇编语言代码,应该说大部分人对这种格式的汇编语言还不是很了解,所以我觉得有必要介绍一下。 接着,我主要介绍一下gcc的内嵌式汇编语言的格式。gcc的内嵌式汇编语言提供了一种在C语言源程序中直接嵌入汇编指令的很好的办法, 既能够直接控制所形成的指令序列,又有着与C语言的良好接口,所以在Linux代码中很多地方都使用了这一语句。 三.AT&T的汇编语言语法格式 我想我们大部分人对Intel格式的汇编语言都很了解了。但是,在Linux核心代码中,所有的汇编语言指令都是用AT&T格式的汇编语言书写的。这两种汇编语言在语法格式上有着很大的不同: 1. 在AT&T的汇编语言中,用'$'前缀表示一个立即操作数;而在Intel的格式中,立即操作数的表示不带任何前缀符。例如:下面两个语句是完全相同的: *AT&T: pushl $4 *Intel: push 4 2. AT&T和Intel的汇编语言格式中,源操作数和目标操作数的位置正好相反。Intel的汇编语言中,目标操作数在源操作数的左边;而在AT&T的汇编语言中,目标操作数则在源操作数的右边。例如: *AT&T : addl $4,