以下是做什么的?有人可以用伪代码解释吗?
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在