【问题标题】:MASM32 String InputMASM32 字符串输入
【发布时间】:2016-02-04 14:11:33
【问题描述】:

我正在尝试进行组装,并认为 MASM32 将是一个好的开始。但我遇到了一个问题。我正在阅读大量 Iczelion 的在线教程,并且想知道如何显示字符串(通过键盘输入)而不是单键输入。

这是他提供的代码:

.386 
.model flat,stdcall 
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\gdi32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\gdi32.lib

.data 
ClassName db "SimpleWinClass",0 
AppName  db "Our First Window",0 
char WPARAM 20h                         ; the character the program receives from keyboard

.data? 
hInstance HINSTANCE ? 
CommandLine LPSTR ?

.code 
start: 
    invoke GetModuleHandle, NULL 
    mov    hInstance,eax 
    invoke GetCommandLine
    mov CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT 
    invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
    LOCAL wc:WNDCLASSEX 
    LOCAL msg:MSG 
    LOCAL hwnd:HWND 
    mov   wc.cbSize,SIZEOF WNDCLASSEX 
    mov   wc.style, CS_HREDRAW or CS_VREDRAW 
    mov   wc.lpfnWndProc, OFFSET WndProc 
    mov   wc.cbClsExtra,NULL 
    mov   wc.cbWndExtra,NULL 
    push  hInst 
    pop   wc.hInstance 
    mov   wc.hbrBackground,COLOR_WINDOW+1 
    mov   wc.lpszMenuName,NULL 
    mov   wc.lpszClassName,OFFSET ClassName 
    invoke LoadIcon,NULL,IDI_APPLICATION 
    mov   wc.hIcon,eax 
    mov   wc.hIconSm,eax 
    invoke LoadCursor,NULL,IDC_ARROW 
    mov   wc.hCursor,eax 
    invoke RegisterClassEx, addr wc 
    invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ 
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ 
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ 
           hInst,NULL 
    mov   hwnd,eax 
    invoke ShowWindow, hwnd,SW_SHOWNORMAL 
    invoke UpdateWindow, hwnd 
    .WHILE TRUE 
                invoke GetMessage, ADDR msg,NULL,0,0 
                .BREAK .IF (!eax) 
                invoke TranslateMessage, ADDR msg 
                invoke DispatchMessage, ADDR msg 
        .ENDW 
    mov     eax,msg.wParam 
    ret 
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    LOCAL hdc:HDC 
    LOCAL ps:PAINTSTRUCT

    .IF uMsg==WM_DESTROY 
        invoke PostQuitMessage,NULL 
    .ELSEIF uMsg==WM_CHAR 
        push wParam 
        pop  char 
        invoke InvalidateRect, hWnd,NULL,TRUE 
    .ELSEIF uMsg==WM_PAINT 
        invoke BeginPaint,hWnd, ADDR ps 
        mov    hdc,eax 
        invoke TextOut,hdc,0,0,ADDR char,1 
        invoke EndPaint,hWnd, ADDR ps 
    .ELSE 
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam 
        ret 
    .ENDIF 
    xor    eax,eax 
    ret 
WndProc endp 
end start 

【问题讨论】:

  • 由于您似乎正在创建一个窗口应用程序(而不是控制台应用程序),因此向您的窗口添加一个可以接收用户输入的 Edittext 控件会更有意义。
  • 我明白了。但是我该如何添加呢?对不起这个问题。我对此很陌生。

标签: assembly masm32


【解决方案1】:

您似乎在 MASM 中进行 GUI 编程。既然你只是想以简单的方式显示一个字符串,试试这个。

这是一个控制台应用程序

.686P
.MODEL FLAT
.STACK 4096

EXTERN  _printf     :PROC
EXTERN  _scanf      :PROC

.DATA
szRead          BYTE    "%s", 0
szStr           BYTE    80 DUP (?)

.CODE

_main   PROC

    lea     edx, szStr
    push    edx
    lea     ebx, szRead
    push    ebx
    call    _scanf
    add     esp, 8

    push    edx
    lea     ebx, szRead
    push    ebx
    call    _printf
    add     esp, 8

    xor     eax, eax
    ret

_main   ENDP

END

编译控制台版本:ml.exe hello.asm /link libcmt.lib kernel32.lib

【讨论】:

  • 谢谢!但是如果我希望字符串输入显示在 Windows 程序而不是控制台中呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多