一、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当回事啊!
上,如果你想看的话在command line里面加上/FAs,就可以在编译的同时输出对应该c/c++文件的arm汇编文件,但是
想在C/C++中用__asm{}直接嵌入arm的汇编代码,它就翻脸不认人了!真是让人无语,你自己都能根据c来改成汇编,
现在想给你减轻点负担你反倒给我尥蹶子!
不过X86的嵌入汇编倒是没问题,看来MS还是不怎么把ARM当回事啊!
baidu,google找了个遍,找的我都快成斗鸡眼了,好歹皇天不负有心人,在一个msdn的论坛里面让我找到一个3年前的
帖,发帖的哥们碰到了和我一样的问题,有所不同的是这哥们是在eVc4下面,跟帖中明确提到在eVc4和vs2005中都不支
持arm的嵌入汇编,而且gcc中居然也不支持!
帖,发帖的哥们碰到了和我一样的问题,有所不同的是这哥们是在eVc4下面,跟帖中明确提到在eVc4和vs2005中都不支
持arm的嵌入汇编,而且gcc中居然也不支持!
但是---vs2005中是可以对纯粹的arm汇编文件进行编译的,当然也可以将c编译生成的obj文件和asm汇编文件生成的obj
文件进行link。
文件进行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 "$(IntDir)\$(InputName).obj" [$Inputs] "
Outputs="$(IntDir)\$(InputName).obj"
FileExtensions="*.asm"
ExecutionDescription="Executing tool..."
>
<Properties></Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
文件,内容如下:
<?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 "$(IntDir)\$(InputName).obj" [$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/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}
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]
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 ==========
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
链接:http://cid-91bd938aa4dc6162.spaces.live.com/blog/cns!91BD938AA4DC6162!157.entry