yas*_*ash 1 assembly arm addressing-mode
#include <stdio.h>
void fun();
int main()
{
int a = 10;
fun();
return 0;
}
void fun()
{
int a = 5;
}
Run Code Online (Sandbox Code Playgroud)
汇编代码。
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
Run Code Online (Sandbox Code Playgroud)
在上面的汇编代码 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。
第一种形式通常用于将东西压入堆栈:将堆栈指针递减,为堆栈上的新事物腾出空间,然后写入值。第二种形式用于弹出:读取堆栈上的值,然后递增堆栈指针,有效地从堆栈的活动部分移除空间。
它们还可用于遍历数组、加载或存储元素以及移动指针,而无需单独的指令来加载/存储和更改指针。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |