TA的每日心情 | 开心 3 天前 |
---|
签到天数: 2059 天 [LV.Master]伴坛终老 ![[数字电视开发网赖祥宁] 粉丝数:952 微博数:5392 新浪微博达人勋](source/plugin/sina_login/img/light.png)
|
消息来自- 北京海淀
最近要在Android NDK程序中添加如ASM(汇编)代码,但对格式并不了解,在NDK官方Doc中也没找到对应信息,于是在网络上查找研究之。
0. 背景介绍:
NDK编译器支持C/C++ 嵌入汇编代码。但Sam感觉X86,ARM,MIPS等编译器对嵌入汇编代码的格式和具体指令格式并不相同,所以理论上各种指令集应该都有一套专有代码。Sam只关心ARM指令集,所以以下所有代码和方法均只对ARM平台有效。
1. 内嵌式ARM代码:
1.1:代码加入:
__asm__ __volatile__ ("MRC p15,0,%0,c0,c0,0" : "=r" (id) );
或者:
asm(
"MRC p15, 0, R1, c0, c0 ,0 \n\t"
"STR R1,[R0],#0 \n\t"
);
1.2:编译:
ndk-build -B V=1
正常编译。但运行时,指出 illegal instruction.
2. 单独添加.S 文件的方式:
2.1:文件生成:
生成ARMCPUID.s 和 ARMCPUID.h文件,内容分别为:
ARMCPUID.s
.text
.align 4
.arm
.globl ARMCPUID
ARMCPUID:
MRC p15, 0, R1, c0, c0 ,0
STR R1,[R0],#0
MOV pc,lr
ARMCPUID.h:
extern "C" void ARMCPUID(unsigned int *id);
2.2: 加其入C/C++代码:
unsigned int id;
ARMCPUID(&id);
2.3: 将.s文件加入编译编译列表:
Android.mk中,
LOCAL_SRC_FILES += ARMCPUID.s
2.4: 编译:
ndk-build -B V=1 |
|