[英]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.