晚上在家试着编译一个apk例子,发现一个有趣的现象,编译环境为:
Android Studio 2.0 preview + sdk23+ ndk r10e
有这么一段源码:
unsigned int mgetpid()
{
const int syscall = 20;
__asm __volatile (
“mov r7, %0\n”
“mov r2, #0\n”
“svc 0x00000000\n”
:
: “r” (syscall)
: “r7”
);
}
syscall = 20,getpid系统调用号。编译运行,结果怎么都不正确,一直返回20,真是奇了怪了。上IDA,反汇编瞧了眼代码:
.text:00001834 PUSH {R7}
.text:00001836 SUB SP, SP, #0xC
.text:00001838 MOVS R3, #0x14
.text:0000183A STR R3, [SP,#0x10+var_C]
.text:0000183C MOVS R3, #0x14
.text:0000183E MOV R7, R3
.text:00001840 MOV.W R2, #0
.text:00001844 SVC 0
.text:00001846 MOV R0, R3
.text:00001848 ADD SP, SP, #0xC
.text:0000184A LDR.W R7, [SP+4+var_4],#4
.text:0000184E BX LR
神奇吧,svc调用结束后,居然用mov r0,r3ÿ