外联汇编
64位下的CPU由于新增了很多寄存器,所以不开启任何优化级别的G++都开始使用寄存器传递函数参数了,比如 printf() 函数使用的就是寄存器传递参数
所以如果一定要以外联汇编的形式优化程序的,那么估计又要记住参数传递使用寄存器规则
索性使用内联汇编的形式优化,更加自然
内联汇编
G++中的内联汇编分为基本形式的内联汇编与扩展形式的内联汇编;毫无疑问,扩展形式的内联汇编更加复杂,也更加强大
__asm__与asm
两者是一样的,只不过ANSI C标准将asm作为关键字用于其他用途;所以为了与ANSIC兼容,还是使用__asm__;
__volatile__于volatile
告诉编译器,此处禁止优化,与__asm__一同使用,表示不优化内联汇编段
基本形式的内联汇编
可以使用宏定义,来更加方便得使用内联汇编,如
#define _mBeginASM __asm__ __volatile__ (
#define _mEndASM );
基本形式的内联汇编语法如:
_mBeginASM
"汇编代码"
_mEndASM
G++会将"汇编代码"部分逐字插入到为程序生成的汇编代码中,所以应该在每一条指令后面手动添加'\n\t';如
#include<stdio.h>
#define _mBeginASM __asm__ __volatile__ (
#define _mEndASM );
int a=44;
int b=33;
int c;
int main(int argc,char *argv[]){
_mBeginASM
"movl a,%eax\n\t"
"addl b,%eax\n\t"
"movl %eax,c"
_mEndASM
printf("%d\n",c);/* 运行可以看出c为77 */
return 0;
}
/* 使用 g++ -S -o Hello.s Hello.cpp 查看编译器生成的汇编文件*/
/* 全局变量就是直接定义在 .data 段中的数据,而且编译器对变量名并没有使用名称修饰 */
.data
.align 4
.type a, @object
.size a, 4
a:
.long 44
.globl