0

私は2つの入力を受け取り、それらを出力するこのプログラムを作成しました(単純です、はい、しかしそれは練習用です)。コンパイルして正常に動作しますが、意図したとおりに動作しません。これが私のコードです:

.386 
.model flat, stdcall 
option casemap :none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\masm32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib
.data 
   num1 db "Enter a number:", 0 
   num2 db "Enter another number:", 0
.data? 
       buffer1 dd 100 dup(?)
   buffer2 dd 100 dup(?)
.code 
start:
   lea eax, num1
   push eax
   call StdOut
   lea ebx, buffer1
   push ebx
   call StdIn
   hlt
   lea eax, num2
   push eax
   call StdOut
   lea edx, buffer2
   push edx
   call StdIn
   xor eax, eax
   xor ebx, ebx
   xor edx, edx
   lea eax, buffer1
   push eax
   call StdOut
   lea ebx, buffer2
   push ebx
   call StdOut
   push 0 
   call ExitProcess
end start 

次の出力が表示されます。

Enter a number: Enter another number:

それはするべきです:

Enter a number:
; wait for input.
Enter another number:
; wait for input.
; continue with program.

なぜ1行に印刷されるのですか?haltプロセスを停止するためにそこに入れようとしましたが、Windowsはプログラムの実行を停止し、と言いthe program is not respondingます。

編集:

これが私が編集すると言ったコードです:

xor eax, eax
xor ebx, ebx
xor edx, edx
lea eax, buffer1
push eax
call StdOut
lea ebx, buffer2
push ebx
call StdOut

前のコードでこれを実行すると、"This program is not responding."なぜこれなのかと表示されます。

どんな助けでもいただければ幸いです。

よろしく、

プログラム

4

1 に答える 1

3

hltは、明らかに実行を停止します。次のハードウェア割り込みを待機するためにのみ使用する必要があり、オペレーティングシステムによってのみ使用する必要があります。

バッファの長さを指定していないため、StdInは機能していません。したがって、StdInは失敗し、次のStdOutが実行されます。

hltを使用せず、バッファの長さをプッシュしてから、アドレスをバッファにプッシュします。

.386 
.model flat, stdcall 
option casemap :none 

include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\masm32.inc 
include \masm32\include\msvcrt.inc 
include \MASM32\INCLUDE\user32.inc

includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\msvcrt.lib
includelib \MASM32\LIB\user32.lib

atoi PROTO C strptr:DWORD

.data 
   num1 db "Enter a number:", 0 
   num2 db "Enter another number:", 0
   formatStr db "%s+%s=%d", 0

.data? 
   buffer1 dw 100 dup(?)
   buffer2 dw 100 dup(?)
   buffer3 dw 100 dup(?)
.code 
start:
   lea eax, num1
   push eax
   call StdOut

   mov eax,100
   push eax
   lea eax, buffer1
   push eax
   call StdIn

   lea eax, num2
   push eax
   call StdOut

   mov eax,100
   push eax
   lea eax, buffer2
   push eax
   call StdIn

   lea eax, buffer1
   push eax
   call atoi
   mov ebx,eax

   lea eax, buffer2
   push eax
   call atoi 
   add eax,ebx

   push eax
   lea eax,buffer2
   push eax
   lea eax,buffer1
   push eax
   lea eax,formatStr
   push eax
   lea eax,buffer3
   push eax
   call wsprintf


   lea eax,buffer3
   push eax
   call StdOut

   push 0 
   call ExitProcess

end start

出力: 出力

stdcallは、パラメータを右から左にプッシュするように指示します。また、StdInおよびStdOutのコードを確認することでメリットが得られる場合があります。

StdIn proc lpszBuffer:DWORD,bLen:DWORD

   LOCAL hInput :DWORD
   LOCAL bRead  :DWORD

   invoke GetStdHandle,STD_INPUT_HANDLE
   mov hInput, eax

   invoke SetConsoleMode,hInput,ENABLE_LINE_INPUT or \
                                ENABLE_ECHO_INPUT or \
                                ENABLE_PROCESSED_INPUT

   invoke ReadFile,hInput,lpszBuffer,bLen,ADDR bRead,NULL

   mov eax, bRead

   ret

StdIn endp

StdOut proc lpszText:DWORD

    LOCAL hOutPut  :DWORD
    LOCAL bWritten :DWORD
    LOCAL sl       :DWORD

    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov hOutPut, eax

    invoke StrLen,lpszText
    mov sl, eax

    invoke WriteFile,hOutPut,lpszText,sl,ADDR bWritten,NULL

    mov eax, bWritten
    ret

StdOut endp
于 2012-05-21T03:17:12.097 に答える