求解惑一段代码,16进制转10进制

大狮兄 2014-04-20 12:08:15
_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 ;这里是指ecx不为0的时候退出?感觉我的理解没对啊
.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

求解惑啊,谢谢!
...全文
139 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2014-04-21
  • 打赏
  • 举报
回复
引用
.break .if ! ecx ;这里是指ecx不为0的时候退出?感觉我的理解没对啊
ecx 为 0 时应该退出循环;但 .if !ecx 是什么意思呢,若 ecx 为 0 以及 FALSE,那 !ecx 不就是 TRUE 了么,即 .if 条件成立,所以退出;或反之,ecx 非 0,这时应继续下面的处理,ecx 非 0 以及 ecx 为 TRUE 那 !ecx 即为 FALSE,所以这时 .if 条件不成立,就不会 break 而继续下面的处理了。
引用
add eax,ecx ;感觉脑袋好乱,看不懂了
eax 是当前字符之前的运算结果啊,再多一位的话,前面的结果不是要乘以 10 (在 ebx 里的)么,然后再加上当前字符的数值即在 ecx 中的。

这些问题,其实不算多复杂的,只有生成 exe 后在调试软件里输入比较有特征的演示数据,单步看看,就明白了,一次不明白,再来一次。
大狮兄 2014-04-20
  • 打赏
  • 举报
回复
个人的方法不同吧,如果是我自己处理的话,肯定用的不是这种方式,上面的代码是书上的一段例子,我没看明白,想弄懂原理
yuexicheng 2014-04-20
  • 打赏
  • 举报
回复
16进制转10进制为什么要用乘法呢,不管是16进制的数还是10进制的数确切的说不管是多少进制的数它们在计算机里面不就只有一种表示方式吗都是二进制。举个例子来说二进制数0011000101111010既是16进制数317A也是十进制数12666是八进制数30572等等,那么要想把16进制数的317A转换成十进制数的12666,就不用将16进制数按权展开然后相加。cpu已经提供了除法指令div 我们只要除以10不就可以从余数中得到各个数位上相应的数了吗。同样的十进制数12666要转换位16进制数317A直接除以16就是了。楼主用的汇编语法不太了解所以只好说说我对进制转换的理解,尤其是高进制的向低进制转换,在汇编里面如果用乘法的话位权的值很不好确定,用除法就简单多了只要除到商为零这个数就转换完毕了,虽然除法运算比乘法运算更加消耗cpu性能不过现在cpu那么快不是

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧