參考鏈接:
http://www.rosoo.net/a/201201/15603.html
http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html
文摘:
“
arm和thumb的區別:
在一般的情況下,Thumb指令與ARM指令的時間效率和空間效率關係爲: - Thumb代碼所需的存儲空間約爲ARM代碼的60%~70% - Thumb代碼使用的指令數比ARM代碼多約30%~40% - 若使用32位的存儲器,ARM代碼比Thumb代碼快約40% - 若使用16位的存儲器,Thumb代碼比ARM代碼快約40%~50% - 與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%顯然,ARM指令集和Thumb指令集各有其優點,若對系統的性能有較高要求,應使用32位的存儲系統和ARM指令集,若對系統的成本及功耗有較高要求,則應使用16位的存儲系統和Thumb指令集。當然,若兩者結合使用,充分發揮其各自的優點,會取得更好的效果。
斬亂麻 15:33:32 ARM指令集是32位的thumb是16位的,是精簡ARM指令集,主要用於內存非常緊張的地方。
”
按照上面的添加,但遇到鏈接錯誤,還是那個親切熟悉的undefined resolved refernce......錯誤啊~
其實已經可以總結:但凡鏈接文件沒有找到函數這樣的錯誤多半都是c與c++之間函數名的查找不同,c++調用匯編的時候問題也是一樣的。
解決方法自然也一樣啦: 在函數聲明前添加extern "C"
具體如下:
1.編寫好彙編文件:myasm.S
大概如下:
.text
.align 4
.arm
.global myasmfunction
.type myasmfunction, %function
#define SRC_BUFF r0
#define DST_BUFF r3
myasmfunction:
push {r4-r6, lr}
mov DST_BUFF, SRC_BUFF
2.在C++源文件MyCall.cpp中調用上述函數:
extern "C" void myasmfunction(int value);
namespace android {
void MyCall::test()
{
......
myasmfunction(1);
......
}
3.在Android.mk中添加上述彙編源文件:
......
LOCAL_SRC_FILES := MyCall.cpp myasm.S
LOCAL_ARM_MODE := arm
......