次のコードは、CoreFoundation 関数を使用して Hello World を出力するだけです。ただし、適切に整列されたスタックがあるように見えるときはいつでも、機能せず、セグフォルトが発生します。しかし、最終的に機能するようになったとき、スタックが整列していません?!?!?!
global _main
align 4, db 0x90
extern _CFStringCreateWithCString
extern _CFShow
section .data
hw: db 'Hello World!' ,0xA,0
section .text
_main: ; entering a new function stack must be balanced right?
push ebp ; saving ebp (esp + 4)
mov ebp, esp ; moving registers around
; align stack as calling pushed a 4 byte address on to the stack
sub esp, 12 ; balancing the stack back to mod 16 (4 + 12 = 16)
push 8 ; 4 bytes
push hw ; 4 bytes
push 0 ; 4 bytes
call _CFStringCreateWithCString ; 4 bytes
; stack still balanced
sub esp, 12 ; 12 bytes
push eax ; 4 bytes
call _CFShow ; 4 bytes
; that is 20 bytes?!?!? yet when I change the 12 to an 8 it doesn't run and instead segfaults! When I have the stack balanced!
mov eax, 99 ; return value
mov esp, ebp ; restore stack for function that called us
pop ebp
ret ; return
実行すると動作しますが、動作する理由がわかりません。引数が 1 つの関数の場合、esp から 12 を引く必要があります。8 であるべきではありません。push は、引数のスタックのインクリメントを既に処理していませんか?