📄 char.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, bigluo@telekbird.com.cn
; Website: http://asm.yeah.net
; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 公用子程序部分:通用部分
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FillMemory proto :DWORD,:DWORD,:DWORD ;填充内存
_CopyMemory proto :DWORD,:DWORD,:DWORD ;拷贝内存
_GetStringValue proto :DWORD,:DWORD ;转换字符串的值
_GetStringPoint proto :DWORD,:DWORD,:DWORD ;取字符串第N个参数开始指针
;********************************************************************
; 填充内存
; 参数:填充的地址,长度,填充的值
; 相同于:RtlFillMemory
;********************************************************************
_FillMemory proc _lpDest,_dwCount,_dwChar
pushad
mov edi,_lpDest
mov eax,_dwChar
mov ecx,_dwCount
cld
rep stosb
popad
ret
_FillMemory endp
;********************************************************************
; 拷贝内存
; 参数:目标地址,源地址,长度
; 相同于:RtlCopyMemory
;********************************************************************
_CopyMemory proc _lpDest,_lpSource,_dwCount
pushad
mov esi,_lpSource
mov edi,_lpDest
mov ecx,_dwCount
cld
rep movsb
popad
ret
_CopyMemory endp
;********************************************************************
; 转换字符串的值
; 参数:字符串地址,进制(缺省为10进制)
; 返回:数值
;********************************************************************
_GetStringValue proc _lpString,_dwBase
local @dwValue
pushad
mov ebx,_dwBase
.if ebx == 0
mov ebx,10
.endif
xor eax,eax
mov esi,_lpString
_GSV_Loop:
mov cl,[esi]
inc esi
or cl,cl
jz _GSV_LoopEnd
cmp cl,20h
jz _GSV_Loop
cmp cl,'0'
jb _GSV_LoopEnd
cmp cl,'9'
ja _GSV_Check1
sub cl,'0'
jmp _GSV_CheckOK
_GSV_Check1:
or cl,20h
cmp cl,'a'
jb _GSV_LoopEnd
cmp cl,'f'
ja _GSV_LoopEnd
sub cl,'a'-10
_GSV_CheckOK:
movzx ecx,cl
cmp ecx,ebx
jae _GSV_LoopEnd
mul ebx
add eax,ecx
jmp short _GSV_Loop
_GSV_LoopEnd:
mov @dwValue,eax
popad
mov eax,@dwValue
ret
_GetStringValue endp
;********************************************************************
; 取字符串第N个参数开始指针
; 参数:字符串地址,第几个参数,分隔符
; 返回:第N个参数指针
;********************************************************************
_GetStringPoint proc _lpString,_dwNumber,_dwChar
local @dwPoint
pushad
mov esi,_lpString
cld
mov ebx,_dwChar
xor ecx,ecx
inc ecx
cmp ecx,_dwNumber
jz _GSP_OK ;如果取第一个参数直接返回
_GSP_Loop:
lodsb
or al,al
jz _GSP_Error ;如果到字符串尾还没有找到,出错
cmp al,bl
jnz _GSP_Loop
inc ecx ;如果找到分隔符,记数加1
cmp ecx,_dwNumber
jnz _GSP_Loop
_GSP_OK:
lodsb
cmp al,20h ;去掉参数前的空格
jz _GSP_OK
dec esi
clc
jmp _GSP_Return
_GSP_Error:
stc
_GSP_Return:
mov @dwPoint,esi
popad
mov eax,@dwPoint
ret
_GetStringPoint endp
;********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -