我再次遇到同样的问题。所以,这次我创建了一个小函数,它将在控制台上显示一些文本。你在堆栈上推送2个参数,调用函数,查看文本并返回。这是代码:
start:
push dword MyText ; Pointer to the variable from the .data section
push dword 26 ; Number of characters to write
call ShowText
ret
ShowText:
push ebp
mov ebp, esp
push 0
push WrittenChars ; Pointer to the variable from the .bss section
push dword [ebp + 8] ; Number of characters to write
push dword [ebp + 12] ; MyText
push dword [StdHandle] ; Value of StdHandle, from the .bss section
call WriteConsoleA
pop ebp
ret
[section .data]
MyText db 'Abcdefghijklmnopqrstuvxzw', 0Ah
因此,正确的值由WriteConsoleA
推送和检索,文本显示正确,但我仍然遇到访问冲突错误,所以看起来ESP显示错误后显示错误信息。我以为WriteConsoleA
会清除其论点的堆栈,我不知道会发生什么。
答案 0 :(得分:1)
ShowText
没有pascal调用约定,所以在这种情况下你必须自己调整堆栈。
call ShowText
add esp, 08