刘品
学以致用---博主简介:专注语音、视频数字信号处理方面的研究以及算法在手机平台上面的移植和优化。涉及语音/音频编解码,语音增强,语音识别,语音音质客观评估,VOIP语音引擎 Qos算法模块和声音变速不变调和变调不变速等功能实现。熟悉ARM 各个系列的CPU,用ARMv4,ARMv5,ARMv6 and Cortex Neon 汇编优化相关算法代码,争取perforamance 最优。目前主要Windows mobile and Android platform上做相关speech/audio算法以及应用开发, HEVC 编解码器PC 和手机上的开发与应用。(交流Email:liupin.2008@gmail.com)

一、VS2005 ARM 混合汇编

 

vs2005 IDE,arm开发平台,想利用汇编对h264部分算法进行优化,原本以为只要在代码中嵌入__asm{}就可以搞定,
实际上还真不是那么容易的事,几经曲折终于能够编译通过,其间辛苦只有自己知道!
 
究其原因,就是vs2005不支持对ARM的嵌入汇编,也就是说vs2005可以对c/c++的代码进行交叉编译使其能够跑在arm
上,如果你想看的话在command line里面加上/FAs,就可以在编译的同时输出对应该c/c++文件的arm汇编文件,但是
想在C/C++中用__asm{}直接嵌入arm的汇编代码,它就翻脸不认人了!真是让人无语,你自己都能根据c来改成汇编,
现在想给你减轻点负担你反倒给我尥蹶子!
不过X86的嵌入汇编倒是没问题,看来MS还是不怎么把ARM当回事啊!
 
baidu,google找了个遍,找的我都快成斗鸡眼了,好歹皇天不负有心人,在一个msdn的论坛里面让我找到一个3年前的
帖,发帖的哥们碰到了和我一样的问题,有所不同的是这哥们是在eVc4下面,跟帖中明确提到在eVc4和vs2005中都不支
持arm的嵌入汇编,而且gcc中居然也不支持!
但是---vs2005中是可以对纯粹的arm汇编文件进行编译的,当然也可以将c编译生成的obj文件和asm汇编文件生成的obj
文件进行link。
当然arm汇编文件的规则要自定义,实际上就是调用armasm.exe了,为了方便,将这个规则编写成一个vs2005能用的rule
文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile Name="Arm ASM" Version="8.00">
   <Rules>
      <CustomBuildRule
         Name="Arm asm" DisplayName="Arm asm"
         CommandLine="armasm -o &quot;$(IntDir)\$(InputName).obj&quot; [$Inputs] "
         Outputs="$(IntDir)\$(InputName).obj"
         FileExtensions="*.asm"
         ExecutionDescription="Executing tool..."
      >
      <Properties></Properties>
      </CustomBuildRule>
   </Rules>
</VisualStudioToolFile>

将上述内容保存为armasm.rules文件,并在vs2005中
Custom build rules --> Find existing 中进行导入就ok了!
 
剩下的就是编写相应的c/c++文件和asm汇编文件,这里又要注意了,由于采用的是混合编译,而我们都知道编译器在
编译的时候会将函数名阿变量名都做一些修改,而默认采用的c/c++的编译器与armasm.exe的规则很有可能不一样,所以
在link的时候,由于名字更改的规则不一样,就会造成链接不上的问题!
 
如我在一个c文件中引用了一个asm文件里的函数void my_add(int,int,int*),相应在asm文件中定义如下
AREA myadd, CODE, READONLY
 
;void my_add(int, int, int*)
EXPORT my_add
 
my_add
stmdb sp!, {r4-r5, lr}
add  r0, r0, r1 ;r0+r1
str  r0, [r2]
ldmia sp!, {r4-r5, pc}
END
结果在link的时候,死活找不着my_add这个函数,急得我真是...恨不能揪住vs2005的眼皮让他看看清楚!
 
然而,它是没有眼睛的,更没有眼皮...
 
后来将c文件对应的asm文件生成出来后一看,居然名字被改成了|?my_add@@YAXHHPAH@Z|,连忙把汇编里面的标号也改过来,F7
终于蹦出了可爱的...
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
链接:http://cid-91bd938aa4dc6162.spaces.live.com/blog/cns!91BD938AA4DC6162!157.entry
posted on 2009-03-18 22:28  liupin  阅读(2786)  评论(1编辑  收藏  举报

-->