首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MASM32字符串输入

MASM32字符串输入
EN

Stack Overflow用户
提问于 2016-02-04 22:11:33
回答 1查看 1.8K关注 0票数 0

我正在尝试进入汇编领域,并认为MASM32将是一个很好的开始。但我遇到了一个问题。我正在读很多Iczelion的在线教程,我想知道如何显示一个字符串(通过键盘输入),而不仅仅是一个键输入。

这是他提供的代码:

代码语言:javascript
复制
.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 
EN

回答 1

Stack Overflow用户

发布于 2016-02-05 10:43:56

您似乎是在用MASM进行GUI编程。因为您只想以一种简单的方式显示一个字符串,所以试试这个。

下面是一个控制台应用程序

代码语言:javascript
复制
.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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35203286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档