如何提高汇编代码的可读性
来源:互联网 发布:久久热永久域名获取 编辑:程序博客网 时间:2024/06/10 20:43
汇编语言相对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.ogcc -c main_test.c -o main_test.ogcc 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=1ELF .eabi_attribute 24, \val .endm .macro preserve8, val=1ELF .eabi_attribute 25, \val .endm .macro function name, export=0 .macro endfuncELF .size \name, . - \name .endfunc .purgem endfunc .endm.if \export .global EXTERN_ASM\nameEXTERN_ASM\name:.endifELF .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#endiffunction func_add, export=1stmfd sp!,{r4-r12,lr}cmp r2,#8bneto_endvld2.32{q0,q1},[a]vld2.32{q2,q3},[b]vadd.s32q0, q0,q2vadd.s32q1,q1,q3vst2.32{q0,q1},[r1]to_end:ldmfdsp!,{r4-r12,pc}endfunc#undef a#undef b
- 如何提高汇编代码的可读性
- 如何提高代码可读性
- 如何提高代码可读性、可维护性
- 如何提升代码的可读性
- 提高代码可读性的注释技巧
- 提高代码可读性的10个技巧
- 提高代码可读性的 10 个技巧
- 提高代码可读性的10个技巧
- 提高代码可读性的10个技巧
- 提高代码可读性的10个技巧
- 提高代码可读性的10个技巧
- 提高代码可读性的10个技巧
- 提高代码可读性的10个技巧
- 如何编写可读性好的代码
- 提高代码可读性: 命名技术
- xml用于提高代码可读性
- 如何提升代码可读性?
- 减少if语句的嵌套层次,提高代码的可读性
- 操作符号和它们相对应的可选方法和…
- sql 中 case when 语法(转载…
- Android之二维码的生成与解析
- 百度地图api:打车费用计算
- linux安装软件时提示找不到镜像的问题:Couldn't resolve host 'mirrorlist.centos.org'
- 如何提高汇编代码的可读性
- 基于Flex的 图片式 电子热点地图 ImageMap v3.0 已经发布,并在项目中应用。
- 我的学习目标和计划
- 判断素数--char3
- LAMMPS MKL
- hdu 4496 (并差集)
- VC6.0安装Boost以支持正则表达式
- Codeforces-253A
- Makefile.delta-intel