在罗云彬的《Windows环境下32位汇编语言程序设计》中第321页

 

...

.const
szAllowedChar	db	'0123456789ABCDEFabcdef',08h

...

.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

...

主要功能代码为

 

repnz	scasb
			.if	ZERO?
				.if	al > '9'
					and	al,not 20h
				.endif
				invoke	CallWindowProc,lpOldProcEdit,hWnd,uMsg,eax,lParam
				ret
			.endif

 

它限制了输入的字符必须为szAllowedChar中定义的,为0~9,A~F,a~f和退格。其他的字符因为不满足条件而不予处理。

其中

 

and	al,not 20h

实现了所有的大小写都转为大写。

 

 


--------------------------------------------------------------

一个疑问:

这个字符串定义里,没有使用一个逗号和0来表示结尾。

参照这本书对于变量定义的讲解和网络上一篇文章(http://www.cnblogs.com/del/archive/2010/04/04/1704296.html

我觉得很是困惑。在代码里调整了一下定义的位置,也未见明确的错误。

这个不是很理解。难道说“,0”不是必需的?