2

私はasmの初心者で、ユーザーがキーを押して終了するのを待つ単純なハローワールドを作ろうとしています。今のところ、Hello World はすべて問題ありませんが、これから取得した .exe コンソール プログラムは、ユーザーがキーを押すまで画面に表示したままにしておいて、すぐに閉じてしまいます。今私が抱えている問題は、何らかの理由でプログラムがループし続け、ユーザー入力を検索することですが、プログラムを強制的に閉じると (^C)、押したすべてのキーが次のコンソール行に書き込まれていることがわかります。間違ったバッファを使用していました (?)

私は数日間、インターネット上で修正を探していましたが、ついに私は助けを求めています.これは私を夢中にさせています. Windows API...

どうもありがとうございました。どんな助けやヒントも大歓迎です!

コード :

STD_OUTPUT_HANDLE   equ -11
STD_INPUT_HANDLE    equ -10 
NULL                equ 0

global start
extern ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleInputA

section .data
msg                 db "Hello World!", 13, 10, 0
msg.len             equ $ - msg
consoleInHandle     dd 1

section .bss
buffer              resd 2
buffer2             resd 2

section .text
    start:

        push    STD_OUTPUT_HANDLE
        call    GetStdHandle

        push    NULL
        push    buffer
        push    msg.len
        push    msg
        push    eax
        call    WriteConsoleA 

    read:

        push STD_INPUT_HANDLE
        call GetStdHandle
        mov [consoleInHandle],eax
        push consoleInHandle
        push dword[buffer2]
        push 1
        push NULL
        call ReadConsoleInputA

        cmp eax,1
        jge exit
        jmp read

    exit:

        push    NULL
        call    ExitProcess

Windows 関数に関する Moar 情報は、次の場所にあります。

4

1 に答える 1

2

push consoleInHandleハンドルではなく、アドレスをプッシュします。あなたがしたいpush dword [consoleInHandle]。逆に、アドレスを渡したいバッファーの場合は、そこが必要ですpush buffer2。また、このバッファはINPUT_RECORD構造体のサイズにする必要があります。これは 32 バイトだと思います。

更新: Frank がコメントしたように、引数の順序も間違っていました。このコードは私にとってはうまくいきます(@xx私の環境がどのように設定されているかにより、stdcall装飾を追加しなければならなかったことに注意してください-明らかにそれらは必要ありません):

STD_OUTPUT_HANDLE   equ -11
STD_INPUT_HANDLE    equ -10
NULL                equ 0

global start
extern ExitProcess@4, GetStdHandle@4, WriteConsoleA@20, ReadConsoleInputA@16

section .data
msg                 db "Hello World!", 13, 10, 0
msg.len             equ $ - msg
consoleInHandle     dd 1

section .bss
buffer              resd 2
buffer2             resb 32

section .text
    start:

        push    STD_OUTPUT_HANDLE
        call    GetStdHandle@4

        push    NULL
        push    buffer
        push    msg.len
        push    msg
        push    eax
        call    WriteConsoleA@20

    read:

        push STD_INPUT_HANDLE
        call GetStdHandle@4
        mov [consoleInHandle],eax
        push NULL
        push 1
        push buffer2
        push dword [consoleInHandle]
        call ReadConsoleInputA@16

    exit:

        push    NULL
        call    ExitProcess@4
于 2012-11-26T20:00:24.943 に答える