стековый фрейм не удаляется из стека? - PullRequest
0 голосов
/ 23 мая 2018

Я написал одну программу c, которая печатает ввод в вывод std.Затем я перевел его на ассемблер.Кстати, я использую синтаксис AT & T.

Это простой код C.

#include <stdio.h>

int main()
{

int c; 


  while ((c = getchar ()) != EOF) 
    {

    putchar(c);

}

    return 0;
}

int c является локальной переменной.

Затем я преобразовал его в сборку.language.

.file   "question_1.c"
    .text
    .globl  main
    .type   main, @function 

//prolog

main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $20, %esp    // we add 20 bytes to the stack
    jmp .L2
.L3:
    subl    $12, %esp
    pushl   -12(%ebp)
    call    putchar
    addl    $16, %esp
.L2:
    call    getchar
    movl    %eax, -12(%ebp)
    cmpl    $-1, -12(%ebp)
    jne .L3

//assumption this is the epilog
    movl    $0, %eax
    movl    -4(%ebp), %ecx
    leave
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.9.4-2ubuntu1) 4.9.4"
    .section    .note.GNU-stack,"",@progbits

обычно в эпилоге мы должны добавить 20, потому что в прологе мы добавили 20. Итак, кадр стека все еще там?Или я упускаю важный момент?

У меня также есть вопрос относительно основной функции.Обычно функции обычно «вызываются», но где это происходит в коде ассемблера?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 мая 2018

Сразу после метки main, leal 4(%esp), %ecx сохраняет четыре плюс указатель стека в %ecx.В конце процедуры leal -4(%ecx), %esp записывает в четыре раза меньше сохраненного значения в указатель стека.Это напрямую восстанавливает исходное значение, вместо того, чтобы делать это путем добавления суммы, которая была вычтена.

...