Johnathon
Johnathon

Reputation: 13

Use of stack pointer (sp) in arm assembly

I'm slightly confused by the following bit of 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

I don't get how this would go in C. The only bit I get is:

memset(whateverTheStackPointerIs, 0, 52);

But how do I know what sp is and how would it look in C?

Upvotes: 1

Views: 4405

Answers (1)

hmakholm left over Monica
hmakholm left over Monica

Reputation: 23332

The

sub sp, #52

reserves 52 bytes of space for local variables on the stack; afterwards sp will point to the first of those 52 bytes. They are all then zeroed with the memset call. After the memset, stmia stores particular values in the first two words. So the C equivalent would be something like

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

Upvotes: 4

Related Questions