(32位汇编)帮看看哪错了!!改了我半天了
control.asm
-------------------------------------------------------------------
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib
ICO_MAIN equ 1000H
DLG_MAIN equ 1005
IDC_Y equ 1001
IDC_X equ 1002
IDC_N equ 1003
IDC_TITLETEXT equ 1010
.data?
hInstance dd ?
lpChar db 512 dup(?)
Number dd ?
Text dd ?
@N dd ?
@N2 dd ?
lpOldProcEdit dd ?
lpOldProcEditI dd ?
hWinMain dd ?
.const
szText1 db 'and',0
szText2 db 'or',0
szText3 db 'xor',0
szAllowedChar db '0123456789ABCDEFabcdef',08h
szFmtHexToDec db '%u',0
.code
_ProcEdit proc uses ebx edi esi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if uMsg == WM_CHAR
mov eax,wParam
mov edi,offset szAllowedChar
mov ecx,sizeof szAllowedChar
repnz scasb
.if ZERO?
.if al > '9'
and al,not 20h
.endif
invoke CallWindowProc,lpOldProcEdit,\
hWnd,uMsg,eax,lParam
ret
.endif
.else
invoke CallWindowProc,lpOldProcEdit,\
hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcEdit endp
_ProcEditI proc uses ebx edi esi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if uMsg == WM_CHAR
mov eax,wParam
mov edi,offset szAllowedChar
mov ecx,sizeof szAllowedChar
repnz scasb
.if ZERO?
.if al > '9'
and al,not 20h
.endif
invoke CallWindowProc,lpOldProcEditI,\
hWnd,uMsg,eax,lParam
ret
.endif
.else
invoke CallWindowProc,lpOldProcEditI,\
hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcEditI endp
_DECTOHEC proc uses ebx edi esi
lea esi,lpChar
cld
xor eax,eax
mov ebx,16
.while TRUE
movzx ecx,byte ptr [esi]
inc esi
.break .if ! ecx
.if cl > '9'
sub cl,'A' - 0ah
.else
sub cl,'0'
.endif
mul ebx
add eax,ecx
.endw
ret
_DECTOHEC endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @szBuffer[128]:byte
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
mov eax,hWnd
mov hWinMain,eax
invoke SendDlgItemMessage,hWnd,\
IDC_X,EM_LIMITTEXT,8,0
invoke SendDlgItemMessage,hWnd,\
IDC_Y,EM_LIMITTEXT,8,0
invoke SendDlgItemMessage,hWnd,\
IDC_N,EM_LIMITTEXT,10,0
invoke GetDlgItem,hWnd,IDC_X
invoke SetWindowLong,eax,GWL_WNDPROC,addr _ProcEdit
mov lpOldProcEdit,eax
invoke GetDlgItem,hWnd,IDC_Y
invoke SetWindowLong,eax,GWL_WNDPROC,addr _ProcEditI
mov lpOldProcEditI,eax
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText1
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText2
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText3
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_SETCURSEL,0,0
.elseif ax == IDOK
invoke GetDlgItemText,hWnd,IDC_X,addr lpChar,sizeof lpChar
invoke _DECTOHEC
mov edx,Text
invoke GetDlgItemText,hWnd,IDC_Y,addr lpChar,sizeof lpChar
invoke _DECTOHEC
mov ecx,Text
mov ebx,@N2
.if ebx == 0
.elseif ebx == 1
.else ebx == 2
.endif
invoke wsprintf,addr lpChar,addr szFmtHexToDec,@N
invoke SetDlgItemText,hWinMain,IDC_N,addr lpChar
.endif
.elseif ax == IDC_TITLETEXT
shr eax,16
.if ax == CBN_SELENDOK
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_GETCURSEL,0,0
.if eax == 0
mov ebx,0
mov @N2,ebx
.elseif eax == 1
mov ebx,1
mov @N2,ebx
.else eax == 2
mov ebx,2
mov @N2,ebx
.endif
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
------------------------------------------------------------------------
control.rc
--------------------------------------------------------------------------
#include <resource.h>
#define ICO_MAIN 0x1000
#define DLG_MAIN 1005
#define IDC_Y 1001
#define IDC_X 1002
#define IDC_N 1003
#define IDC_TITLETEXT 1010
ICO_MAIN ICON "Main.ico"
DLG_MAIN DIALOG 200, 200, 185, 140
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "位计算器"
FONT 9, "宋体"
{
LTEXT "X", -1, 7, 9, 15, 8
EDITTEXT IDC_Y, 27, 7, 94, 12
LTEXT "Y", -1, 7, 26, 15, 8
EDITTEXT IDC_X, 27, 24, 94, 12
LTEXT "=", -1, 7, 43, 15, 8
EDITTEXT IDC_N,27, 55, 94, 12,ES_NUMBER
COMBOBOX IDC_TITLETEXT, 27, 70, 40, 70, CBS_DROPDOWNLIST | WS_TABSTOP
DEFPUSHBUTTON "开始计算(&C)", IDOK, 60, 90, 50, 14
PUSHBUTTON "退出(&X)", IDCANCEL, 120, 110, 50, 14
}
------------------------------------------------------------------------
makefile
------------------------------------------------------------------------
NAME = Control
OBJS = $(NAME).obj
RES = $(NAME).res
LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff
$(NAME).exe: $(OBJS) $(RES)
Link $(LINK_FLAG) $(OBJS) $(RES)
.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<
clean:
del *.obj
del *.res
改了一天了都不知道哪错了
各位前辈帮帮忙
小弟感激不尽!!