做什么!ARM程序集中的字符操作


#include <stdio.h>
void fun();
int main()
{
int a = 10;
fun();
return 0;
}
void fun()
{
int a =  5;
}

程序集代码。

000103e4 <main>:
103e4:       e52db008        str     fp, [sp, #-8]!
103e8:       e58de004        str     lr, [sp, #4]
103ec:       e28db004        add     fp, sp, #4
103f0:       e24dd008        sub     sp, sp, #8
103f4:       e3a0300a        mov     r3, #10
103f8:       e50b3008        str     r3, [fp, #-8]
103fc:       eb000005        bl      10418 <fun>
10400:       e3a03000        mov     r3, #0
10404:       e1a00003        mov     r0, r3
10408:       e24bd004        sub     sp, fp, #4
1040c:       e59db000        ldr     fp, [sp]
10410:       e28dd004        add     sp, sp, #4
10414:       e49df004        pop     {pc}            ; (ldr pc, [sp], #4)
00010418 <fun>:
10418:       e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
1041c:       e28db000        add     fp, sp, #0
10420:       e24dd00c        sub     sp, sp, #12
10424:       e3a03005        mov     r3, #5
10428:       e50b3008        str     r3, [fp, #-8]
1042c:       e1a00000        nop                     ; (mov r0, r0)
10430:       e24bd000        sub     sp, fp, #0
10434:       e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
10438:       e12fff1e        bx      lr

在上面的汇编代码中103e4:e522db008 str-fp,[sp,#-8]!

我是汇编语言的新手。为什么"!"已被使用的目的是什么。

ARM汇编代码中的!表示地址寄存器已更新。(非常令人兴奋!(在str fp, [sp, #-8]!中,−8被添加到sp,然后fp的内容被存储在sp的新地址。如果!不存在,则fp仍将存储在同一地址,但sp不会被更新。

您可以在代码的其他地方看到相应的指令ldr fp, [sp], #4。在这种形式中,fp的内容被存储在sp中的地址,然后4被添加到sp

第一种形式通常用于将东西推送到堆栈上:堆栈指针递减,为堆栈上的新东西腾出空间,然后写入值。第二种形式用于弹出:读取堆栈上的值,然后增加堆栈指针,有效地从堆栈的活动部分中删除空间。

它们还可以用于遍历数组、加载或存储元素以及移动指针,而不需要单独的指令来加载/存储和更改指针。

最新更新