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

ShowTextPascal 呼び出し規約がないため、この場合は自分でスタックを調整する必要があります。

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