Что означает выравнивание стека?

Я был высокоуровневым кодером, а архитектуры для меня довольно новы, поэтому я решил прочитать руководство по сборке здесь:

http://en.wikibooks.org/wiki/X86_Assembly/Print_Version

Внизу руководства приведены инструкции по преобразованию Hello World! была дана программа

#include 

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

объяснение было:

Этот код "and" s ESP с 0xFFFFFFF0, выравнивание стека со следующим нижняя 16-байтовая граница. An изучение исходного кода Mingw показывает, что это может быть для SIMD инструкции в "_main" процедуры, которые работают только на согласованных адреса. Поскольку наша рутина не содержат инструкции SIMD, эта строка не требуется.

Я не понимаю этого пункта. Может ли кто-нибудь объяснить мне, что означает выравнивание стека по следующей 16-байтовой границе и почему это требуется? И как и достигают этого?

45
задан yoozer8 1 February 2012 в 16:21
поделиться