在Assembly中显示一些文本后,ESP和EIP不正确

时间:2013-07-10 16:39:16

标签: text assembly console stack access-violation

我再次遇到同样的问题。所以,这次我创建了一个小函数,它将在控制台上显示一些文本。你在堆栈上推送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会清除其论点的堆栈,我不知道会发生什么。

1 个答案:

答案 0 :(得分:1)

ShowText没有pascal调用约定,所以在这种情况下你必须自己调整堆栈。

call ShowText
add esp, 08