HookZzModules icon indicating copy to clipboard operation
HookZzModules copied to clipboard

指令传参的顺序影响寄存器使用?求解答

Open etund opened this issue 5 years ago • 0 comments

__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这样操作寄存器,那么原来的值就会被覆盖了。

etund avatar Oct 16 '19 03:10 etund