Рассмотрим эту простую программу Cx86 Сборка Stack Бронирование
#include <stdio.h>
int func()
{
printf("Hello World\n");
return 0;
}
int main()
{
printf("Hello World\n");
return 0;
}
Это соответствующий 32-разрядную сборку составленный НКУ
.file "a.c"
.section .rodata
.LC0:
.string "Hello World"
.text
.globl func
.type func, @function
func:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size func, .-func
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Почему НКУ резерв 24 байт для строки «Hello World» в функции 'func()', но только 16 байтов в основной функции для одной и той же строки?
Это не имеет ничего общего со строкой, она никогда не загружается в стек. $ 16 в прологе основной функции заключается в том, чтобы выровнять указатель стека. Обратите внимание на команду andl. –
Ханс, вы говорите о инструкции andl в основном. Его команда andl, которая выравнивает указатель стека к границе страницы. Я спрашиваю о subl $ 16, (% esp) в основной функции & subl $ 24, (% esp) в func – user1249669