Arm汇编学习笔记(三)——GCC内联汇编

本文详细介绍了GCC内联汇编的基本用法,包括 "=r"、"r" 和 "%0"、"%1" 等符号的含义。通过示例1和示例2展示了内联汇编的两种形式,并解释了输入和输出操作数列表的结构。同时,提到了asm volatile()的使用,以防止编译器优化导致的意外行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前每次看内联汇编都有一些地方看不明白,"=r","r","%0","%1"这些符号看不明白,本次总结一下这些内容吧,虽然很简单,但是手不能懒!


首先,C语言中为什么要内联汇编以及其带来的好处这个我就不说了。C语言中使用汇编要通过函数asm(),即__asm__()的别名,两者是一样的。

常见的内联汇编有下面两种形式:

asm(  
"mov     r0, r0\n\t"  
"mov     r0, r0\n\t"  
"mov     r0, r0\n\t"  
"mov     r0, r0"  
);  

例1


asm(
"mov %[result], %[value], ror #1" 
: [result] "=r" (y) 
: [value] "r" (x)
:
); 

例2


第一种和一般汇编文件中的汇编程序是一样的,这里不多说了。着重看第二种,为什么要有第二种形式呢?这就和为什么要内联汇编有很大关系了,一般都是在一个C的函数中会使用内联汇编,汇编代码一般会与C函数的代码有数据交换,也就是说通过汇编代码来操作C代码中的一些变量数据,而C代码中的数据存放在内存还是寄存器,或者存放在哪个寄存器我们在写C代码的时候并不知道,所以不可能使用第一种内联汇编形式,那就必须要用第二种形式了。下面是第二种汇编形式的格式定义:

asm(
code    /*汇编指令*/
: output operand list     /*输出操作数列表*/
: input operand list    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值