写出来了,龌龊代码共享一下:
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
szDll db "13465789876543",0
szError db "账号必须是数字!",0
szOK db "数字",0
.code
BufferIsnumber Proc _lpmun ;arg=esi
local @hSizeNumber,@hCout
local szNumber[50]:byte
local szNumberBuffer[50]:byte
invoke lstrlen,_lpmun
mov @hSizeNumber,eax
invoke RtlMoveMemory,addr szNumberBuffer,_lpmun,@hSizeNumber
_GoStart:
invoke lstrlen,addr szNumberBuffer ;如果已经没有字符了,说明已经检查完毕,并且都是数字,就返回
.if eax == NULL
mov eax,1
ret
.endif
mov @hCout,0
inc @hCout
invoke RtlZeroMemory,addr szNumber,sizeof szNumber
invoke RtlMoveMemory,addr szNumber,addr szNumberBuffer,1 ;每次都只复制前面第一位来判断
;invoke MessageBox,0,addr szNumber,0,0
lea esi,szNumber
lodsb
cmp al,'0'
jb retFalse
cmp al,'9'
ja retFalse
invoke RtlZeroMemory,addr szNumber,sizeof szNumber
invoke RtlMoveMemory,addr szNumber,addr szNumberBuffer,sizeof szNumberBuffer
invoke RtlZeroMemory,addr szNumberBuffer,sizeof szNumberBuffer
lea eax,szNumber
add eax,@hCout ;减去前面1个数字,因为前面一个字符,已经判断是数字了
invoke lstrcpy,addr szNumberBuffer,eax
jmp _GoStart
ret
retFalse:
xor eax,eax
ret
BufferIsnumber endp
start:
;lea eax,szDll
invoke BufferIsnumber,addr szDll
.if eax == NULL
invoke MessageBox,0,addr szError,0,MB_ICONSTOP
.elseif
invoke MessageBox,0,addr szOK,0,MB_ICONINFORMATION
.endif
invoke ExitProcess,0
end start