Я решил, что будет забавно изучить сборку x86 во время летних каникул. Поэтому я начал с очень простой программы hello world, позаимствовав на бесплатных примерах gcc -S
. Я закончил с этим:
HELLO:
.ascii "Hello, world!\12\0"
.text
.globl _main
_main:
pushl %ebp # 1. puts the base stack address on the stack
movl %esp, %ebp # 2. puts the base stack address in the stack address register
subl $20, %esp # 3. ???
pushl $HELLO # 4. push HELLO's address on the stack
call _puts # 5. call puts
xorl %eax, %eax # 6. zero %eax, probably not necessary since we didn't do anything with it
leave # 7. clean up
ret # 8. return
# PROFIT!
Он компилирует и даже работает ! И я думаю, что понимаю большинство этого.
Хотя на шаге 3 происходит волшебство. Если бы я удалил эту строку, моя программа умерла бы между вызовом puts
и xor
из-за ошибки выравнивания стека. И если бы я изменил $20
на другое значение, оно тоже вылетело бы. Поэтому я пришел к выводу, что это значение very
важно.
Проблема в том, что я не знаю, что это делает и зачем это нужно.
Может кто-нибудь объяснить мне? (Я на Mac OS, это когда-нибудь будет иметь значение.)