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
:
版权声明:本文标题:GCC-Inline-ASM-GCC内联汇编 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1715482104a454417.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论