【问题标题】:What does the ! character do in ARM assembly?是什么! ARM汇编中的字符?
【发布时间】:2020-02-25 13:20:47
【问题描述】:
#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]!

我是汇编语言的新手。 为什么 '!'一直用什么目的。

【问题讨论】:

  • infocenter.arm.com 有 arm 文档,其中包含有关指令集的详细信息。
  • 如果您使用优化进行编译(例如 GCC 的 -O2),生成的汇编代码将变得更短且更具可读性。如果没有优化,就会生成很多“虚拟”代码。此外,由于这可能是 C,因此将函数声明和定义为 void fun(void) 以明确表示不传递任何参数。

标签: assembly arm addressing-mode


【解决方案1】:

ARM 汇编代码中的! 表示地址寄存器已更新。 (很刺激!)在str fp, [sp, #-8]!中,sp加上-8,然后fp的内容就存储在sp的新地址中。如果! 不存在,fp 仍将存储在同一地址,但不会更新sp

在代码的其他地方有一条相应的指令,ldr fp, [sp], #4。在这种形式中,fp的内容存储在sp中的地址,然后sp加4。

第一种形式通常用于将事物压入堆栈:堆栈指针递减以为堆栈上的新事物腾出空间,然后写入值。第二种形式用于弹出:读取堆栈上的值,然后堆栈指针递增,有效地从堆栈的活动部分移除空间。

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

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多