这是'非压缩BCD'转'压缩BCD'的程序,所谓'非压缩BCD',就是用一个字节的低位(0-7),
储存一个十进制值,比如 07 08 09 02, 表示十进制的2987,而'压缩BCD',
就是用一个字节高位(8-15)存十进制的十位,低位(0-7)存十进制的个位,
那么39h,37h,34h,33h,30h,38h,转换后会变 79h,34h,80h.
回到题目
1. count equ ($-ascbuf) / 2
$是当前位置和ascbuf的地址差,也就是上面6个字节,所以6/2 = 3
2.
Lodsb;读入ds:[si]值放入al,也即十进制的个位,假如读入39h,al=39h
and al,0fh ;清除7-15位元 , al=09h
mov bl,al ;保存, bl = 09h
程序最后一个回圈,bl='30h,38h'这一组的低位,也就是 bl = 00h (之前的 3 被0f AND 掉)
3.
bcdbuf + 1,第2个压缩BCD,即34h
储存一个十进制值,比如 07 08 09 02, 表示十进制的2987,而'压缩BCD',
就是用一个字节高位(8-15)存十进制的十位,低位(0-7)存十进制的个位,
那么39h,37h,34h,33h,30h,38h,转换后会变 79h,34h,80h.
回到题目
1. count equ ($-ascbuf) / 2
$是当前位置和ascbuf的地址差,也就是上面6个字节,所以6/2 = 3
2.
Lodsb;读入ds:[si]值放入al,也即十进制的个位,假如读入39h,al=39h
and al,0fh ;清除7-15位元 , al=09h
mov bl,al ;保存, bl = 09h
程序最后一个回圈,bl='30h,38h'这一组的低位,也就是 bl = 00h (之前的 3 被0f AND 掉)
3.
bcdbuf + 1,第2个压缩BCD,即34h