私も同じような問題を抱えています。そこで、今回はコンソールにテキストを表示する小さな関数を作成しました。スタックに 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
たのですが、何が起こるかわかりません。