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

📄 editsubclass.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
HToAscii proto :dword,:dword
.data
ClassName                     db "EditClass",0
TitleName                      db "无符号十六进制数",0
ButtonClassName           db "BUTTON",0
EditClassName              db "EDIT",0
PushButtonText             db "转换十进制",0
ClearNull                       db " ",0
Buffer                           db 11 dup (0)
.data?
hInstance                  HINSTANCE ?
hwndButtonPush       HWND      ?
OldWndProc             LPSTR     ?
hwndEditInput          HWND      ?
hwndEditOutput       HWND      ?
.const
ID_BUTTON_PUSH     equ 1
ID_EDIT                    equ 2
.code
start:
   invoke GetModuleHandle, NULL
   mov    hInstance,eax
   invoke WinMain, NULL,NULL,NULL, 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 or CS_DBLCLKS
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   mov   eax, hInstance
   mov   wc.hInstance,eax
   invoke GetStockObject,WHITE_BRUSH 
   mov   wc.hbrBackground,eax
   mov   wc.lpszMenuName,NULL
   mov   wc.lpszClassName,OFFSET ClassName
   invoke LoadIcon,NULL,IDI_ASTERISK
   mov   wc.hIcon,eax
   mov   wc.hIconSm,0
   invoke LoadCursor,NULL,IDC_HAND
   mov   wc.hCursor,eax
   invoke RegisterClassEx, addr wc
   invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW,addr ClassName,\
       addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,300,\
       NULL,NULL,hInst,NULL
   mov   hwnd,eax
   invoke ShowWindow,hwnd,CmdShow
   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_VISIBLE or WS_CHILD,80,50,180,20,hWnd,ID_EDIT,hInstance,NULL
      mov hwndEditInput,eax
      invoke SetWindowLong,hwndEditInput,GWL_WNDPROC,addr EditWndProc
      mov OldWndProc,eax
      invoke SetFocus ,hwndEditInput
      invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr PushButtonText,WS_VISIBLE or WS_CHILD or  BS_DEFPUSHBUTTON or BS_VCENTER,120,100,80,30,hWnd,ID_BUTTON_PUSH,hInstance,NULL
      mov hwndButtonPush,eax
      invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,WS_VISIBLE or WS_CHILD or ES_READONLY,80,180,180,20,hWnd,ID_EDIT,hInstance,NULL
      mov hwndEditOutput,eax
   .elseif uMsg==WM_COMMAND
      mov eax,wParam
      .if  lParam	
         .if ax==ID_BUTTON_PUSH
            shr eax,16
            .if ax==BN_CLICKED
               invoke SendMessage, hwndEditInput,WM_GETTEXT,9,addr Buffer
               invoke htodw,addr Buffer; 十六进制的字符串转换为双字保存于EAX中。
               invoke HToAscii,eax,addr Buffer; eax中的双字转换为十进制的字符串。
               lea esi,Buffer
FilterZero:   
               cmp byte ptr [esi],'0'
               jnz next
               inc esi
               jmp FilterZero                                                             
next:                         
               invoke SendMessage,hwndEditOutput,WM_SETTEXT,0,esi
            .endif
         .endif
      .endif
   .else
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam
      ret
   .endif
   xor    eax,eax
   ret
WndProc endp
EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
   .if uMsg==WM_CHAR
      cmp wParam,VK_BACK       
      jz backspace
      invoke SendMessage, hEdit,WM_GETTEXT,9,addr Buffer
      .if eax>7
         invoke MessageBeep,MB_ICONASTERISK
         xor eax,eax
         ret
      .endif
      mov eax,wParam
      .if (al>='0' && al<='9') || (al>='A' && al<='F') || (al>='a' && al<='f') 
         .if al>='a' && al<='f'
            sub al,20h
         .endif
         invoke CallWindowProc,OldWndProc,hEdit,uMsg,eax,lParam
         ret	
      .else
         invoke MessageBeep,MB_ICONASTERISK
      .endif
   .else
backspace:          
      invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
      ret
   .endif
   xor eax,eax
   ret
EditWndProc endp
HToAscii PROC uses esi edi ebx edx reg:dword ,temp:dword; 十六进制数转换化十进制的字符。
   mov eax,reg
   mov ebx,temp
   mov esi,10
   mov ecx,10
again:
   xor edx,edx
   div ecx
   add dl,30h
   dec esi
   mov [ebx][esi],dl
   or esi,esi
   jnz again
   ret 
HToAscii endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -