📄 my.asm
字号:
;;;************************************************
;;; 闫磊
;;; win32编程
;;; 20022339
;;;*************************************************
.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 ;图形方面的操作
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
;;************************************************
;;************************************************
.data
ClassName db "MyClass",0
AppName db "求和",0
ResultName db "结果是:",0
MenuName db "MyMenu",0
ButtonClassName db "button",0
ButtonText1 db "求和",0
ButtonText2 db "清空",0
EditClassName db "edit",0
edit2string db 0
edit1string db 0
helpname db "帮助",0
helpstring db "收到帮助消息",0
_Mystring db "非法字符只可用0-9间的数",0
x dw 0
resultbuffer db 256 dup(0)
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndButton1 HWND ?
hwndButton2 HWND ?
hwndEdit1 HWND ?
hwndEdit2 HWND ?
bufferl1 db 256 dup(?)
bufferl2 db 256 dup(?)
lpOldProcEdit dd ?
.const
ButtonID1 equ 1
ButtonID2 equ 4
EditID1 equ 2
EditID2 equ 3
IDM_CLEAR equ 2
IDM_EXIT equ 4
IDM_ADD equ 5
IDM_HELP equ 1
;;*******************************************
.code
;;*******************************************
;;求和函数
;;*******************************************
_TransAdd proc
pushad
pushf
mov resultbuffer,30h
mov esi,1
.while bufferl1[esi]!=0
inc esi
.endw
mov ecx,esi
mov esi,1
.while bufferl2[esi]!=0
inc esi
.endw
mov edx,esi
.if ecx>edx
mov esi,ecx
.else
mov esi,edx
.endif
dec ecx
dec edx
mov ebx,esi
push ebx
dec esi
.while esi>0
.if ecx>0
mov al,bufferl1[ecx]
sub al,30h
dec ecx
.else
mov al,0
.endif
.if edx>0
mov bl,bufferl2[edx]
sub bl,30h
dec edx
.else
mov bl,0
.endif
add al,bl
.if al>9
sub al,0ah
add resultbuffer[esi-1],1
.endif
add al,30h
add resultbuffer[esi],al
.if resultbuffer[esi]>'9'
sub resultbuffer[esi],0ah
add resultbuffer[esi-1],1
.endif
dec esi
.endw
.if resultbuffer=='0'
mov esi,0
pop ebx
.while esi<=ebx
mov al,resultbuffer[esi+1]
mov resultbuffer[esi],al
inc esi
.endw
.endif
popf
popad
ret
_TransAdd endp
;;*********************************************
;;清空缓冲区
;;*********************************************
_ClearProc proc
pushf
pushad
mov esi,255
.while esi>0
mov bufferl1[esi],0
dec esi
.endw
mov esi,255
.while esi>0
mov bufferl2[esi],0
dec esi
.endw
mov esi,255
.while esi>0
mov resultbuffer[esi],0
dec esi
.endw
popad
popf
ret
_ClearProc endp
;;*******************************************
;;编辑框处理函数
;;*******************************************
_ProcEdit proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
mov eax,uMsg
.if uMsg == WM_CHAR
mov eax,wParam
.if eax>'9'
jmp _quit
.elseif eax<'0'
jmp _quit
.endif
invoke CallWindowProc,lpOldProcEdit,hWnd,uMsg,eax,lParam
ret
.else
invoke CallWindowProc,lpOldProcEdit,hWnd,uMsg,wParam,lParam
ret
.endif
_quit:
invoke MessageBox,hWnd,ADDR _Mystring,ADDR ResultName,MB_OK
mov eax,0
ret
_ProcEdit endp
;;*******************************************
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
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_BTNFACE+1
mov wc.lpszMenuName,OFFSET MenuName
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,hInst,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,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,400,300,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
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
ES_AUTOHSCROLL,\
50,35,200,25,hWnd,EditID1,hInstance,NULL
mov hwndEdit1,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
ES_AUTOHSCROLL,\
50,70,200,25,hWnd,EditID2,hInstance,NULL
mov hwndEdit2,eax
invoke SetFocus, hwndEdit1
invoke SetWindowText,hwndEdit1,ADDR edit1string
invoke SetWindowText,hwndEdit2,ADDR edit2string
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText1,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
80,105,50,25,hWnd,ButtonID1,hInstance,NULL
mov hwndButton1,eax
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText2,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
140,105,50,25,hWnd,ButtonID2,hInstance,NULL
mov hwndButton2,eax
invoke SetWindowLong,hwndEdit1,GWL_WNDPROC, _ProcEdit
mov lpOldProcEdit,eax
invoke SetWindowLong,hwndEdit2,GWL_WNDPROC,addr _ProcEdit
mov lpOldProcEdit,eax
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF lParam==0
.IF ax==IDM_HELP
invoke MessageBox,NULL,ADDR helpstring,ADDR helpname,MB_OK
.ELSEIF ax==IDM_CLEAR
invoke SetWindowText,hwndEdit1,NULL
invoke SetWindowText,hwndEdit2,NULL
invoke _ClearProc
.ELSEIF ax==IDM_ADD
invoke GetWindowText,hwndEdit1,ADDR bufferl1+1,256
;;**********************
;invoke atodw,ADDR bufferl1
; mov dword ptr x,eax
;;***********************
invoke GetWindowText,hwndEdit2,ADDR bufferl2+1,256
;;*************************
;invoke atodw,ADDR bufferl2
;add eax,dword ptr x
;invoke dwtoa,eax,ADDR resultbuffer
;;*************************
invoke _TransAdd
invoke MessageBox,NULL,ADDR resultbuffer, ADDR ResultName,MB_OK
invoke SetWindowText,hwndEdit1,NULL
invoke SetWindowText,hwndEdit2,NULL
invoke _ClearProc
invoke SetFocus, hwndEdit1
.ELSE
invoke DestroyWindow,hWnd
.ENDIF
.ELSE
.IF ax==ButtonID1
shr eax,16
.IF ax==BN_CLICKED
invoke SendMessage,hWnd,WM_COMMAND,IDM_ADD,0
.ENDIF
.ELSE
.IF ax==ButtonID2
shr eax,16
.IF ax==BN_CLICKED
invoke SetWindowText,hwndEdit1,NULL
invoke SetWindowText,hwndEdit2,NULL
.ENDIF
.ENDIF
.ENDIF
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -