g++ 内联汇编 外联汇编

外联汇编

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   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值