admin管理员组

文章数量:1530845

2024年5月12日发(作者:)

GCC Inline ASM GCC内联汇编

GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline

ASM——GCC内联汇编。这是一个非常有用的功能,有利于我们将一些C/C++语法无法

表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写

简洁高效的代码。

1。GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子:

__asm__("movl %esp,%eax”); // 看起来很熟悉吧!或者是__asm__("

movl $1,%eax // SYS_exit

xor %ebx,%ebx

int $0x80

");或__asm__(

"movl $1,%eaxrt”

"xor %ebx,%ebxrt”

”int $0x80"

);基本内联汇编的格式是__asm__ __volatile__("Instruction List");

1、__asm____asm__是GCC关键字asm的宏定义:#define __asm__ asm__asm__

或asm用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是

必不可少的.2、Instruction ListInstruction List是汇编指令序列。它可以是空的,比如:

__asm__ __volatile__(”"); 或__asm__ (”");都是完全合法的内联汇编表达式,只不过这

两条语句没有什么意义。但并非所有Instruction List为空的内联汇编表达式都是没有意义

的,比如:__asm__ (””:::”memory"); 就非常有意义,它向GCC声明:“

我对内存作了改动”,GCC在编译的时候,会将此因素考虑进去。我们看一看下

面这个例子:$ cat example1。cint main(int __argc, char* __argv[])

{

int* __p = (int*)__argc;(*__p) = 9999;//__asm__(””:::"memory");if((*__p)

== 9999)

return 5;return (*__p);

}在这段代码中,那条内联汇编是被注释掉的。在这条内联汇编之前,内存指针__p所指

向的内存被赋值为9999,随即在内联汇编之后,一条if语句判断__p 所指向的内存与9999

是否相等。很明显,它们是相等的。GCC在优化编译的时候能够很聪明的发现这一点.我们

使用下面的命令行对其进行编译:$ gcc -O —S example1.c选项-O表示优化编译,我们

还可以指定优化等级,比如-O2表示优化等级为2;选项—S表示将C/C++源文件编译为

汇编文件,文件名和C/C++文件一样,只不过扩展名由.c变为.s。我们来查看一下被放在

example1.s中的编译结果,我们这里仅仅列出了使用gcc 2。96在RedHat 7。3上编译

后的相关函数部分汇编代码。为了保持清晰性,无关的其它代码未被列出。$ cat

本文标签: 汇编代码内联编译优化