Я был высокоуровневым кодером, а архитектуры для меня довольно новы, поэтому я решил прочитать учебник по сборке здесь:
http://en.wikibooks.org/wiki/X86_Assembly/Print_Version
Вдалеке к руководству, инструкции о том, как преобразовать Hello World! программа
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
в эквивалентный код сборки и было создано следующее:
.text
LC0:
.ascii "Hello, world!\12\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
Для одной из строк
andl $-16, %esp
объяснение было:
Этот код "и" s ESP с 0xFFFFFFF0, выравнивание стека со следующей самая низкая 16-байтовая граница. изучение исходного кода Mingw показывает, что это может быть для SIMD инструкции, появляющиеся в "_main" рутины, которые работают только на выровненных адреса. Поскольку наша процедура не содержат инструкции SIMD, эта строка не требуется.
Я не понимаю этого. Может ли кто-нибудь дать мне объяснение, что означает выравнивание стека со следующей 16-байтной границей и почему это требуется? И как достигается andl
?