如何提高汇编代码的可读性

汇编语言相对C语言和C++,在执行速度上有着不错的优势,尤其在一些数据量巨大的处理场合。所以不难理解很多DSP、ARM程序员需要使用汇编来优化代码。本人从事视频编解码工作,在工作中也遇到了一些需要汇编优化的情况,发现汇编代码的可读性是可以通过一些方式提高的,在此与大家分享一下。

本文所使用的为ARM 汇编,ARM v5 指令集以上。以下是本贴内容:

1、如何使用汇编

2、如何提高汇编的可读性 


1、如何使用汇编:

假如我有一个函数func需要使用汇编优化,将该函数的汇编代码写在 func_asm.S文件中,调用该函数的代码写在main_test.c中

main_test.c 对该函数声明如下:

extern  void  func(int a, int b);
然后编译如下:
gcc -c  func_asm.s -o func_asm.o
gcc -c  main_test.c -o main_test.o
gcc func_asm.o main_test.o -o test
这样,就可以运行 test进行代码调试了。总体而言,用法跟c语言是类似的。


2、如何提高汇编代码的可读性:

汇编代码的格式令人头疼,常见的有GNU格式和ARM 格式。更令人心烦的是它们都很难读。在阅读ffmpeg代码的过程中,我发现ffmpeg中的汇编很容易阅读和查找,而且代码风格简单明了。在此推荐一下,它是通过一堆宏定义实现的。代码如下:

#ifdef __ELF__
#   define ELF
#else
#   define ELF @
#endif

        .macro require8, val=1
ELF     .eabi_attribute 24, \val
        .endm

        .macro preserve8, val=1
ELF     .eabi_attribute 25, \val
        .endm

        .macro function name, export=0
        .macro endfunc
ELF     .size   \name, . - \name
        .endfunc
        .purgem endfunc
        .endm
.if \export
        .global EXTERN_ASM\name
EXTERN_ASM\name:
.endif
ELF     .type   \name, %function
        .func   \name
\name:
        .endm

        .macro movrel rd, val
#if HAVE_ARMV6T2 && !CONFIG_PIC
        movw            \rd, #:lower16:\val
        movt            \rd, #:upper16:\val
#else
        ldr             \rd, =\val
#endif
        .endm

#if HAVE_VFP_ARGS
        .eabi_attribute 28, 1
#   define VFP
#   define NOVFP @
#else
#   define VFP   @
#   define NOVFP
#endif

#define GLUE(a, b) a ## b
#define JOIN(a, b) GLUE(a, b)
#define X(s) JOIN(EXTERN_ASM, s)
有了这些宏指令之后,就可以使用C语言的一些宏指令了,于是代码的可读性瞬间提高了,以下是一个NEON汇编的小程序,可读性是否有点类似于C语言了呢~

#ifndef a
#define a  r0
#define b  r1
#endif

function func_add, export=1
		stmfd 		sp!,		{r4-r12,lr}
		cmp 		r2,		#8
		bne		to_end
		vld2.32		{q0,q1},	[a]
		vld2.32		{q2,q3},	[b]
		vadd.s32	q0, 		q0,		q2
		vadd.s32	q1,		q1,		q3
		vst2.32		{q0,q1},	[r1]
to_end:
		ldmfd		sp!,		{r4-r12,pc}
endfunc

#undef a
#undef b


好了,本帖到此结束,欢迎大家多多指教~




                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值