内联汇编简介

19 篇文章 0 订阅
11 篇文章 0 订阅

在C语言中嵌入汇编(Assembly)代码,可以使用内联汇编(Inline Assembly),这在一些需要精确控制硬件或者优化性能的场合非常有用

以下是关于ASM语法的介绍,主要基于GCC(GNU Compiler Collection)提供的内联汇编特性



基本语法

在GCC中,可以通过asm__asm__关键字来嵌入汇编代码。基本的语法结构如下:

asm("assembly code");

以下是一个简单的内联汇编示例,将两个整数相加并返回结果:

__STATIC_FORCEINLINE uint32_t custom_add(uint32_t a, uint32_t b)
{
    uint32_t result;

    __ASM volatile("add %0, %1, %2" : "=r"(result) : "r"(a), "r"(b));

    return result;
}
操作符说明
  • __ASM 用于标记内联汇编代码块
  • : : 冒号用于分隔不同部分,包括输出操作数、输入操作数和描述符
操作数部分
  • : "=r" (result): 输出操作数。=r表示将结果存储在一个寄存器中,result是C语言中的变量
  • : "r" (a), "r" (b): 输入操作数。r表示使用寄存器,ab是C语言中的变量



更多示例

__STATIC_FORCEINLINE uint64_t __LD(volatile void *addr)
{
    uint64_t result;
    __ASM volatile ("ld %0, 0(%1)" : "=r" (result) : "r" (addr));
    return result;
}
__STATIC_FORCEINLINE void __SW(volatile void *addr, uint32_t val)
{
    __ASM volatile ("sw %0, 0(%1)" : : "r" (val), "r" (addr));
}
__ASM volatile("addi %0, %1, %2" : "=r"(result) : "r"(a), "i"(b));

__ASM volatile("mv sp, %0" ::"r"(stack));

__ASM volatile("mret");



关于内联

内联可以避免函数调用的开销,也可以使用特定的汇编指令集和寄存器操作来提高性能,用得不好也会适得其反

/** 建议内联. */
#ifndef   __STATIC_INLINE
  #define __STATIC_INLINE                        static inline
#endif

/** 强制内联. */
#ifndef   __STATIC_FORCEINLINE
  #define __STATIC_FORCEINLINE                   __attribute__((always_inline)) static inline
#endif
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值