4

我用谷歌搜索和搜索,我没有发现任何有用的东西。如何将输出发送到控制台,并通过程序集从控制台接受用户输入?

我正在使用 MASM32

4

4 回答 4

12

正如 filofel 所说,使用 Win32 API。这是一个小小的 hello world 示例:

.386
.MODEL flat, stdcall
 STD_OUTPUT_HANDLE EQU -11 
 GetStdHandle PROTO, nStdHandle: DWORD 
 WriteConsoleA PROTO, handle: DWORD, lpBuffer:PTR BYTE, nNumberOfBytesToWrite:DWORD, lpNumberOfBytesWritten:PTR DWORD, lpReserved:DWORD
 ExitProcess PROTO, dwExitCode: DWORD 

 .data
 consoleOutHandle dd ? 
 bytesWritten dd ? 
 message db "Hello World",13,10
 lmessage dd 13

 .code
 main PROC
  INVOKE GetStdHandle, STD_OUTPUT_HANDLE
  mov consoleOutHandle, eax 
  mov edx,offset message 
  pushad    
  mov eax, lmessage
  INVOKE WriteConsoleA, consoleOutHandle, edx, eax, offset bytesWritten, 0
  popad
  INVOKE ExitProcess,0 
 main ENDP
END main

组装:

ml.exe helloworld.asm /link /subsystem:console /defaultlib:kernel32.lib /entry:main

现在要捕获输入,您将使用类似的 API 函数(例如ReadConsoleInput. 我把它作为练习留给你。

于 2010-04-27T10:37:59.860 回答
2

在现代 Windows 世界中,“控制台”可能相当含糊。如果说控制台程序,真的是DOS程序,可以使用DOS INT 21 API,比调用Win32简单多了。我没有 MASM,但这是一个简单的例子,说明如何读取字符和写入字符。有关更多 DOS 功能,请参阅此内容。

MOV AH,1      ; code for "read a character"
INT 21H        ; character gets put in AL

MOV AH,2       ; code for "write a character"
MOV DL,'A'     ; ascii code goes in DL
INT 21H
于 2010-04-27T21:53:00.877 回答
2

只需使用 Win32 API:通过写入 STD_OUTPUT_HANDLE(并从 STD_INPUT_HANDLE 读取)。 请参阅 MSDN 中的 GetStdHandle()作为起点...使用 MASM HLL 构造来帮助您(INVOKE 是您调用 Win32 函数和传递参数的朋友)。

于 2010-04-27T06:33:59.890 回答
1

下载并链接到Irvine32库,它们将为您提供非常用户友好的输入和输出功能。

于 2011-10-18T01:05:11.827 回答