_HexToDec proc
local @szBuffer[512]:byte
invoke GetDlgItemText,hWinMain,IDC_HEX,addr @szBuffer,sizeof @szBuffer
lea esi,@szBuffer
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
invoke wsprintf,addr @szBuffer,addr szFmtHexToDec,eax
invoke SetDlgItemText,hWinMain,IDC_DEC,addr @szBuffer
ret
_HexToDec endp
mul ebx 的作用就是 eax * ebx 结果保存到 edx:eax 中. 这段代码应该是把输入框里面的十六进制字符船转换为数值吧, 如 '12EF' -> 12efh 结果通过 wsprintf 函数以十进制显示在另外一个里面
while 循环前置 eax 为 0 是置初始结果为 0.
这里说例子又比较烦了, 假如输入的是 "12EF":
1. while 循环前, 0 -> eax
2. 读入输入的字符 '1' 后, '1'-'0' = 1 -> ecx
eax * ebx = 0 * 10h = 0
eax + ecx = 0 + 1 = 1 -> eax
3. 读入字符 '2', '2' -'0' = 2 -> ecx
eax * ebx = 1 * 10h = 10h
eax + ecx = 10h + 2 = 12h -> eax
4. 读入字符 'E', 'E' - ('A' - 0ah) = 0eh -> ecx
eax * ebx = 12h * 10h = 120h
eax + ecx = 120h + 0eh = 12eh -> eax
5. 读入字符 'F', 'F' - ('A' - 0ah) = 0fh -> ecx
eax * ebx = 12eh * 10h = 12e0h
eax + ecx = 12e0h + 0fh = 12efh -> eax
从上面的 2. - 5. 的循环处理输入的字符后, 结果 eax 中的内容分别是 1, 12h, 12eh, 12efh 这样子看这个算法就比较明白了吧. 这个就是逐次乘进制累加的计算方法了. 如果循环前 eax 不置 0 的话, 后面的结果就会引入一个错乱的数据, 而且, 影响很大, 因为它是被后面乘了好多次 (等于输入的字符个数)