Объяснение разборки самой простой программы (x86) - PullRequest
3 голосов
/ 25 мая 2010

следующий код

int _main() {return 0;}

Скомпилировано с помощью команды:

gcc -s -nostdlib -nostartfiles 01-simple.c -o01-simple.exe

gcc версия 4.4.1 (TDM-1 mingw32)

OllyDbg произвел этот вывод:

alt text

Можете ли вы объяснить, что здесь происходит? Анализ на данный момент:

// these two seems to be an idiom:
PUSH EBP        // places EBP on stack
MOV EBP, ESP    // overwrites EBP with ESP

MOV EAX, 0      // EAX = 0

LEAVE          // == mov esp, ebp
               //    pop ebp
               // according to 
               // http://en.wikipedia.org/wiki/X86_instruction_listings

В чем смысл всего этого?

Ответы [ 3 ]

5 голосов
/ 25 мая 2010

Это создает кадр стека .

PUSH EBP      
MOV EBP, ESP  

В используемом соглашении о вызовах возвращаемое значение отправляется обратно через EAX (поэтому 0 существует, потому что вы написали return 0; - попробуйте изменить это значение на return 1; и посмотрите, как это влияет на код) .

MOV EAX, 0 

И это говорит процессору очистить кадр стека (это эквивалент MOV ESP, EBP, за которым следует POP EBP, что противоположно тому, что было сделано при создании кадра стека):

LEAVE
1 голос
/ 25 мая 2010

Инструкция устанавливает фрейм стека при запуске загрузчиком времени выполнения функции int _main(),

PUSH EBP
MOV EBP, ESP

Установлен кадр стека, и для доступа к параметрам, если они были предоставлены, будет смещено EBP + размер параметра (WORD, BYTE, LONG и т. Д.).

Обычно регистр EAX является обычным регистром для возврата состояния выхода из среды выполнения загрузчику операционной системы,

MOV EAX, 0
LEAVE

Другими словами, чтобы сказать, что программа успешно завершилась, возвращая 0 в Операционную систему.

Если используется возврат, кадр стека восстанавливается при выполнении во время выполнения до передачи управления обратно в Операционную систему.

POP EBP

По общему мнению, если произошла ошибка, значение будет ненулевым и может использоваться как из пакетных файлов (возвращаясь к старым временам DOS), так и из сценариев Unix, где он проверяет, успешно ли работала программа или нет и продолжайте в зависимости от характера командного файла или сценария.

0 голосов
/ 25 мая 2010

Инструкция 'MOV EAX, 0' - это тело вашей функции. Код заголовка предназначен для установки пространства для запуска вашего кода.

Инструкция 'LEAVE' возвращает ваш код туда, куда он пришел. Даже если вы сказали, что нет стандартных библиотек, есть много другого кода, который компоновщик помещает на место.

...