Что это ! персонаж делать в сборке ARM? - PullRequest
1 голос
/ 25 февраля 2020
#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]!

Я новичок в языке ассемблера. Почему '!' была использована какова цель.

1 Ответ

4 голосов
/ 25 февраля 2020

То, что ! в коде сборки ARM означает, что регистр адресов обновлен. (Это очень увлекательно!) В str fp, [sp, #-8]! к-1003 * добавляется −8, а затем содержимое fp сохраняется по новому адресу в sp. Если ! не было, fp все равно будет сохранено по тому же адресу, но sp не будет обновлено.

Существует соответствующая инструкция, которую вы видите в другом месте кода, ldr fp, [sp], #4. В этой форме содержимое fp сохраняется по адресу в sp, а затем к sp добавляется 4.

Первая форма обычно используется для помещения вещей в стек: указатель стека уменьшается, чтобы освободить место для новых вещей в стеке, а затем записывается значение. Вторая форма используется для выталкивания: значение в стеке считывается, а затем указатель стека увеличивается, эффективно удаляя пространство из активной части стека.

Их также можно использовать для итерации массив, загрузка или сохранение элементов и перемещение указателя без необходимости в отдельных инструкциях для загрузки / сохранения и изменения указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...