c语言内嵌汇编,C指针原理教程之C内嵌汇编

本文详细介绍了C语言内嵌汇编的使用,包括内联汇编的基本格式、如何与C程序交互,以及如何访问全局和局部变量。通过实例展示了内联汇编如何操作寄存器和内存,解释了编译器优化对内联汇编的影响,并探讨了内存分配方式。
摘要由CSDN通过智能技术生成

内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为它具有这种能力,所以 "asm" 可以用作汇编指令和包含它的 C 程序之间的接口。简单得说,内联汇编,就是可以让程序员在C语言中直接嵌入汇编代码,并与汇编代码交互C程序中的C表达式,享受汇编的高运行效率。

内联汇编的格式是直接在C代码中插入以下格式:

asm(

....

....

)

其中的"..."为汇编代码,比如下面例子中,在 result=a*b和printf("%d\n",result)之间插入一段汇编,

下面的这段汇编什么都不做,每个nop指令占用一个指令的执行时间

result=a*b;

asm("nop\n\t"

"nop\n\t"

"nop\n\t"

"nop");//4个nop指令,\n\t表示换行,然后加上TAB行首空,因为每个汇编指令必须在单独一行,需要换行,加上制表符是为了适应某些编译器的要求。

printf("%d\n",result);

可以很明显地看到:

汇编代码之间用“\n\t”间隔,并且每条汇编代码单独占用一行,共有4个nop指令,每个指令后的“\n\t”表示换行,然后加上TAB行首空,因为每个汇编指令必须在单独一行,需要换行,加上制表符是为了适应某些编译器的要求。

下面是一个完整的例子,内嵌的汇编完成对2个C程序定义的全局变量c和d的相加,并将相加结果存入全局变量addresult中:

#include

int c=10;

int d=20;

int addresult;

int main(void){

int a=6;

int b=2;

int result;

result=a*b;

asm("nop\n\t"

"nop\n\t"

"nop\n\t"

"nop");//4个nop指令,\n\t表示换行,然后加上TAB行首空,因为每个汇编指令必须在单独一行,需要换行,加上制表符是为了适应某些编译器的要求。

printf("%d\n",result);

asm("pusha\n\t"

"movl c,%eax\n\t"

"movl d,%ebx\n\t"

"add %ebx,%eax\n\t"

"movl %eax, addresult\n\t"

"popa");//使用全局C变量c和d

printf("%d\n",addresult);

return 0;

}

编译上述代码

$ gcc -o test test.c

$ ./test

12

30

在汇编代码中可以直接使用变量名称操作C程序定义的全局变量,比如c、d和addresult就是全局变量:

"movl c,%eax\n\t"

"movl d,%ebx\n\t"

"movl %eax, addresult\n\t"

内联汇编部分如果不需要编译器优化( 优化可能破坏汇编代码的内部结构,因为汇编代码直接操作寄存器,而寄存器使用优化是编译器提供的功能), 可以在 "asm" 后使用关键字 "volatile"。

asm volatile(

....<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值