在臂组件中使用堆栈指针(sp)

时间:2011-08-14 16:19:46

标签: ios assembly stack arm disassembly

我对下面的反汇编感到有些困惑:

_GSEventLockDevice:
000047d8        b5f0    push    {r4, r5, r6, r7, lr}
000047da        af03    add r7, sp, #12
000047dc        b08d    sub sp, #52
000047de    f7ffffb3    bl  _GSGetPurpleSystemEventPort
000047e2        466d    mov r5, sp
000047e4        2234    movs    r2, #52
000047e6        2100    movs    r1, #0
000047e8        4604    mov r4, r0
000047ea        4628    mov r0, r5
000047ec    f005e8b0    blx 0x9950  @ symbol stub for: _memset
000047f0        2600    movs    r6, #0
000047f2    f24030f6    movw    r0, 0x3f6
000047f6        4621    mov r1, r4
000047f8    e88d0041    stmia.w sp, {r0, r6}
000047fc        4628    mov r0, r5
000047fe    f7fffaf7    bl  _GSSendEvent
00004802        b00d    add sp, #52
00004804        bdf0    pop {r4, r5, r6, r7, pc}
00004806        bf00    nop

我不知道这将如何进入C.我得到的唯一一点是:

memset(whateverTheStackPointerIs, 0, 52);

但我怎么知道sp是什么以及它在C中看起来怎么样?

1 个答案:

答案 0 :(得分:4)

sub sp, #52

为堆栈上的局部变量保留52个字节的空间;之后sp将指向这52个字节中的第一个。然后使用memset调用将它们全部置零。在memset之后,stmia在前两个单词中存储特定值。所以C等价物就像是

GEEventLockDecvice() {
    int tmp = GSGetPurpleSystemEventPort();
    int localdata[13] = {0};
    localdata[0] = *0x3f6;
    localdata[1] = 0;
    return GSSendEvent(&localdata, tmp);
}