以下ARM指令是什么意思?

逆向工程 拆卸 手臂
2021-06-10 03:20:54

尽管阅读了以下参考资料,但我仍有一些我不明白的 ARMv7 指令:ARM 信息中心

在以下情况下:

  a7a4d8:   b530        push    {r4, r5, lr}
  a7a4da:   466c        mov r4, sp
  a7a4dc:   4605        mov r5, r0
  a7a4de:   682a        ldr r2, [r5, #0]
  a7a4e0:   ebad 0d02   sub.w   sp, sp, r2
  a7a4e4:   f104 0014   add.w   r0, r4, #20 ; 0x14
  a7a4e8:   4669        mov r1, sp
  a7a4ea:   b082        sub sp, #8
  a7a4ec:   466a        mov r2, sp
  a7a4ee:   462b        mov r3, r5
  a7a4f0:   f746 f1b8   bl  5c0864 <RoutineName>
  a7a4f4:   9800        ldr r0, [sp, #0]
  a7a4f6:   9901        ldr r1, [sp, #4]
  a7a4f8:   46a5        mov sp, r4
  a7a4fa:   bd30        pop {r4, r5, pc}

以下有什么作用?有人可以用伪代码来解释吗?

  a7a4de:   682a        ldr r2, [r5, #0]
  a7a4e0:   ebad 0d02   sub.w   sp, sp, r2
  a7a4e4:   f104 0014   add.w   r0, r4, #20 ; 0x14

  a7a4f4:   9800        ldr r0, [sp, #0]
  a7a4f6:   9901        ldr r1, [sp, #4]
1个回答

ldr r2, [r5, #0]
表示 r2=*(r5+0)
加载 r5 指向的值并将其放置在 r2 中。

sub.w sp, sp, r2
表示 sp=sp-r2
将 sp 减去r2中的值(以分配堆栈空间)。

add.w r0, r4, #20 ; 0x14
表示 r0=r4+20
将 20(十进制)加到 r4 并将结果放在 r0 中。

ldr r0, [sp, #0]
表示 r0=*(sp+0)
加载 sp 指向的值并将其放置在 r0 中。

ldr r1, [sp, #4]
表示 r1=*(sp+4)
加载(sp+4)指向的值并将其放置在 r1 中。

在 C 伪代码中,它看起来像这样:

x_a7a4d8(dword *ptr_allocsize, void *arg1)
{
  alloca(*ptr_allocsize)
  dword p2;
  qword p1;
  x_5c0864(&arg1, &p1, &p2, ptr_allocsize)
  return p1;
}

所以它为5c0864例程返回的值分配了一些空间(因为它使用堆栈返回值),调用5c0864例程,并返回5c0864返回的值。