; #########################################################################
; --------------------------------------
; This procedure was written by Iczelion
; 注释翻译、添加 by 老刘。
; --------------------------------------
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \MASM32\INCLUDE\kernel32.inc
.code
; #########################################################################
a2dw proc uses ecx edi edx esi String:DWORD
;----------------------------------------
; Convert decimal string into dword value
; return value in eax
;----------------------------------------
xor ecx, ecx
mov edi, String
invoke lstrlen, String
.while eax != 0
xor edx, edx
mov dl, byte ptr [edi]
sub dl, "0" ; subtrack each digit with "0" to convert it to hex value
mov esi, eax
dec esi
push eax
mov eax, edx ;ascii对应的byte
push ebx
mov ebx, 10
.while esi > 0 ;num*10^esi
mul ebx ;结果到eax(低位),edx(高位)中
dec esi
.endw
pop ebx
add ecx, eax ;ecx储存结果
pop eax
inc edi
dec eax
.endw
mov eax, ecx
ret
a2dw endp
; #########################################################################
end
; #########################################################################
; ---------------------------------------------------------------
; 本程序最初由 Tim Roberts 编写
;
; Alexander Yackubtchik 优化了部分代码
; ---------------------------------------------------------------
.486
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
.code
; #########################################################################
atodw proc String:DWORD
; ----------------------------------------
; 十进制转dword
; eax储存返回值
; ----------------------------------------
push esi
push edi
xor eax, eax
mov esi, [String]
xor ecx, ecx
xor edx, edx
mov al, [esi]
inc esi
cmp al, 2D ;检测负号
jne proceed ;不是负号就跳转
mov al, byte ptr [esi]
not edx ;FFFFFFFF
inc esi
jmp proceed
@@:
sub al, 30h ;ascii->byte
lea ecx, dword ptr [ecx+4*ecx] ;ecx*=5
lea ecx, dword ptr [eax+2*ecx] ;ecx=ecx*2+eax
mov al, byte ptr [esi]
inc esi
proceed:
or al, al
jne @B ;非0(没处理完)上跳
lea eax, dword ptr [edx+ecx]
xor eax, edx
pop edi
pop esi
ret
atodw endp
; #########################################################################
end