繁体   English   中英

arm 组件中堆栈指针 (sp) 的使用

[英]Use of stack pointer (sp) in arm assembly

我对以下反汇编有点困惑:

_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 中的 go 会如何。 我得到的唯一一点是:

memset(whateverTheStackPointerIs, 0, 52);

但是我怎么知道 sp 是什么以及它在 C 中的外观如何?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM