夏休みに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を使用していますが、それが問題になることはありません。)