Использование указателя стека (sp) в сборке руки - PullRequest
1 голос
/ 14 августа 2011

Я немного смущен следующим битом разборки:

_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 Ответ

4 голосов
/ 14 августа 2011

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);
}
...