0

我又遇到了同样的问题。所以,这次我创建了一个小函数,它将在控制台上显示一些文本。您将 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,文本正确显示,但我仍然收到Access Violation Error,所以在显示消息后看起来 ESP 是错误的。我以为WriteConsoleA会清除它的论点,我不知道会发生什么。

4

1 回答 1

1

ShowText没有帕斯卡调用对流,所以在这种情况下你必须自己调整堆栈。

call ShowText
add esp, 08
于 2013-07-10T16:41:41.553 回答