⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my.asm

📁 学汇编时编写的数据求和的小程序,希望能给正在学习汇编的同学有所帮助.
💻 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 + -