У вас не включена оптимизация, поэтому компилятор генерирует действительно плохой код. Основное хранилище для всех ваших значений находится в кадре стека, а значения загружаются в регистры только достаточно долго, чтобы выполнять вычисления.
Код фактически разбивается на:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
Стандартный пролог функции, установка нового фрейма стека и резервирование 50 байтов для фрейма стека.
movl $0, -4(%ebp)
movl $1, -24(%ebp)
movl $2, -20(%ebp)
movl $3, -16(%ebp)
movl $4, -12(%ebp)
movl $6, -8(%ebp)
Заполнить кадр стека фиктивными значениями (предположительно, в качестве средства отладки).
movl 8(%ebp), %eax
addl $1, %eax
movl %eax, -4(%ebp)
Считать параметр c из стекового фрейма, добавить к нему один, сохранить его в (другом) слоте стека.
movl -4(%ebp), %eax
leave
ret
Считать значение обратно из слота стека и вернуть его.
Если вы скомпилируете это с оптимизацией, вы увидите, что большая часть кода исчезнет. Если вы используете -fomit-frame-pointer -Os
, вы должны получить следующее:
max:
movl 4(%esp), %eax
incl %eax
ret