尽管在以下位置阅读了参考资料,但我有一些我不理解的ARMv7指令:在以下环境中:

以下是做什么的?有人可以用伪代码解释吗?

  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}


#1 楼

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

sub.w sp, sp, r2
表示sp = sp- r2
将sp减去r2中的值(以分配堆栈空间)。 r4并将结果放置在r0中。 />
add.w r0, r4, #20 ; 0x14
表示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返回的值。

评论


谢谢你,彼得!我终于发现这是在以下寻址模式下解决的:davespace.co.uk/arm/introduction-to-arm/addressing.html

– chuacw
2013年9月23日23:26在