Понимание кода сборки x86 из кода C - PullRequest
3 голосов
/ 11 марта 2012

C код:

#include <stdio.h>

main() {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%s\n", "hello");
    }
}

ASM:

    .file   "simple_loop.c"
    .section    .rodata
.LC0:
    .string "hello"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp # push ebp onto stack
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp # setup base pointer or stack ?
    .cfi_def_cfa_register 5
    andl    $-16, %esp # ? 
    subl    $32, %esp # ?
    movl    $0, 28(%esp) # i = 0
    jmp .L2
.L3:
    movl    $.LC0, (%esp) # point stack pointer to "hello" ?
    call    puts # print "hello"
    addl    $1, 28(%esp) # i++
.L2:
    cmpl    $9, 28(%esp) # if i < 9
    jle .L3              # goto l3
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret

Поэтому я пытаюсь улучшить мое понимание кода сборки x86. Для приведенного выше кода я отметил то, что, как мне кажется, я понимаю. Что касается вопроса, отмеченного содержанием, может кто-то поделиться каким-то светом? Кроме того, если какой-либо из моих комментариев отключен, пожалуйста, дайте мне знать.

1 Ответ

2 голосов
/ 11 марта 2012
andl    $-16, %esp # ? 
subl    $32, %esp # ?

Это резервирует некоторое место в стеке.Сначала инструкция andl округляет регистр %esp до следующего младшего кратного 16 байт (упражнение: выясните, что такое двоичное значение -16, чтобы понять, почему).Затем инструкция subl перемещает указатель стека вниз немного дальше (32 байта), зарезервировав еще немного места (которое будет использоваться далее).Я подозреваю, что это округление сделано таким образом, чтобы доступ через регистр %esp был несколько более эффективным (но вам нужно проверить таблицы данных вашего процессора, чтобы выяснить, почему).1010 * адрес строки "hello" в стеке (эта инструкция не изменяет значение самого регистра %esp).По-видимому, ваш компилятор считает более эффективным перенос данных в стек напрямую, чем использование инструкции push.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...