다음 코드는 CoreFoundation 함수를 사용하여 Hello World를 인쇄하는 것입니다. 그러나 내가 겉으로보기에 제대로 정렬 된 스택을 가지고있을 때마다 작동하지 않습니다. 하지만 마침내 스택이 제대로 작동하지 않게되었을 때?!?!?!esp가 증가하지 않는 한 코드 segfaults
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
실행하면 작동하지만 아무런 이유가 없습니다. 하나의 인수 함수에 대해 esp에서 12를 빼야합니다. 그것은 8이 아니어야하며, 인수에 대해 스택을 증가시키는 것을 이미 처리하지 않았습니까?
스택에서 마지막 세 개의 매개 변수를 제거하기 위해 esp에 12를 추가하면 안됩니까? (_CFStringCreateWithCString 호출 후) – BlackBear
CFStringCreateWithCString이 스택에서 해당 인수를 팝하면 그렇게하지 않습니까? – Zimm3r
인수는 호출 된 함수에 의해 스택에서 절대 팝 아웃되지 않습니다. 그렇지 않으면 스택 프레임이 엉망이됩니다. – BlackBear