【问题标题】:How can I do Input/Output on a console with MASM? [closed]如何使用 MASM 在控制台上进行输入/输出? [关闭]
【发布时间】:2010-04-27 02:22:11
【问题描述】:

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

我正在使用 MASM32

【问题讨论】:

    标签: assembly masm


    【解决方案1】:

    正如 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)进行类似操作。我把它作为练习留给你。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        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
        

        【讨论】:

        • 使用 MASM32 排除了使用 16 位 DOS API 调用。
        • 如果你使用 LINK16 而不是 LINK,我相信你可以从 MASM32 目标文件生成 16 位 DOS 程序。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-04-25
          • 1970-01-01
          • 2022-11-04
          • 2011-08-27
          • 2021-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多