簡體   English   中英

有什么用! 字符在ARM匯編中做什么?

[英]What does the ! character do in ARM assembly?

#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: e52db008 str fp, [sp, #-8]!

我是匯編語言的新手。 為什么 '!' 已被使用的目的是什么。

那個! 在 ARM 匯編代碼中意味着地址寄存器被更新。 (非常精彩!)在str fp, [sp, #-8]! , -8 被添加到sp ,然后fp的內容存儲在sp中的新地址。 如果! 不存在, fp仍將存儲在同一地址,但sp不會更新。

您可以在代碼的其他地方看到相應的指令ldr fp, [sp], #4 在這種形式中,將fp的內容存儲在sp中的地址處,然后將 4 添加到sp

第一種形式通常用於將東西壓入堆棧:將堆棧指針遞減為堆棧上的新事物騰出空間,然后寫入值。 第二種形式用於彈出:讀取堆棧上的值,然后遞增堆棧指針,有效地從堆棧的活動部分移除空間。

它們還可用於遍歷數組、加載或存儲元素以及移動指針,而無需單獨的指令來加載/存儲和更改指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM