C中内联汇编

内联汇编允许程序员在C代码中嵌入汇编指令,以执行C无法直接完成的任务,如饱和算术运算和控制协处理器。内联汇编的格式包括_asm__volatile_结构,其中asmcode定义汇编指令,output和input分别定义输出和输入参数,changedregisters标记被修改的寄存器。示例展示了无参数和加法运算的内联汇编用法。
摘要由CSDN通过智能技术生成

内联汇编是在C中直接使用汇编语句进行编程,使程序可以在C中实现C语言不能完成的工作。
下面几种常见的需要使用内联汇编的程序:

  1. 在程序中使用饱和算术运算(Saturating Arithmetic)
  2. 程序中要对协处理器进行操作
  3. 在C程序中完成对程序状态寄存器的操作

内联汇编格式

_asm_ _volatile_("asm code" :output :input :changed registers);
  • asm或者_asm_开头,括号内容写汇编指令

  • asm code 填写汇编代码,指令 + \n\t用双引号引上

      "mov r0, r0\n\t"
      "mov r1, r1\n\t"
      "mov r2, r2"
    
  • output(asm->C)用于定义输出的参数,通常只能是变量

      : "constraint"(variable)
      "constraint"用于定义variable的存放位置
       r 表示使用任何可用的寄存器
       m 表示使用变量的内存地址
       + 表示可读可写
       = 表示只写
    
  • input(C->asm) 用于定义输入的参数,可以使变量和立即数

        : "constraint"(variable)
       "constraint"用于定义variable的存放位置
         r 表示使用任何可用的寄存器(立即数和变量都可以)
        m 表示使用变量的内存地址
        i 表示使用立即数
    

注意事项
在这里插入图片描述
arm汇编为例

  • 例1:无参数,无返回值,这种情况,output intput 可以省略
asm
(   
	"mrs r0,cpsr      \n\t"
	"bic r0,r0,#0x80  \n\t" 
	"msr cpsr,r0      \n\t"    
);
  • 例2:让内联汇编做加法运算,求a+b,结果放在sum中,a-b放在d中(op1用来指代)
asm volatile
(
	"add %[op1],%[op2],%[op3]   \n\t"
	"sub %[op4],%[op2],%[op3]   \n\t"
	:[op1]"=r"(sum),[op4]"=r"(d)
	:[op2]"r"(a),[op3]"r"(b)
	:"memory"
);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值