HookZzModules
HookZzModules copied to clipboard
指令传参的顺序影响寄存器使用?求解答
__asm__ volatile(
"mov x0, %[name_ptr]\n"
"mov x1, #4\n"
"mov x2, %[info_ptr]\n"
"mov x3, %[size_ptr]\n"
"mov x4, #0\n"
"mov x5, #0\n"
"mov w16, #202\n"
"svc #0x80\n"
:
:[name_ptr] "r" (&name), [info_ptr] "r" (&info), [size_ptr] "r" (&size)
:"%x1", "%x2", "%x3"
);
这样写,在编译成汇编的时候会出错,偶尔会变成以下指令
mov x0 , ...
mov x1, #4
mov x2, x1
mov x3, x2
...
然后,换成这样写
__asm__ volatile(
"mov x0, %[name_ptr]\n"
"mov x3, %[size_ptr]\n"
"mov x2, %[info_ptr]\n"
"mov x1, #4\n"
"mov x4, #0\n"
"mov x5, #0\n"
"mov w16, #202\n"
"svc #0x80\n"
:
:[name_ptr] "r" (&name), [info_ptr] "r" (&info), [size_ptr] "r" (&size)
:"%x1", "%x2", "%x3"
);
则能够对x0, x2, x3正确赋值。
第一种偶尔不能达到目的,第二种可以。
找到原因了,自问自答一波: 下面是armv7下生成的汇编代码
0x6321c <+88>: str r0, [sp, #0x30]
0x6321e <+90>: add r0, sp, #0x24
0x63220 <+92>: add r1, sp, #0x34
0x63222 <+94>: add r2, sp, #0x20
0x63224 <+96>: mov r0, r0
0x63226 <+98>: mov r3, r2
0x63228 <+100>: mov r2, r1
0x6322a <+102>: mov.w r1, #0x4
0x6322e <+106>: mov.w r4, #0x0
0x63232 <+110>: mov.w r5, #0x0
0x63236 <+114>: mov.w r12, #0xca
0x6323a <+118>: svc #0x80
在内联汇编代码,在我们的指令前会先用r0, r1, r2,存对应的地址,然后如果我们按照r0,r1,r2,r3这样操作寄存器,那么原来的值就会被覆盖了。