汇编10→2

来源:百度知道 编辑:UC知道 时间:2024/06/28 06:00:27
这时把10进制转为2进制的一段子程序
DECIBIN PROC NEAR
POSH AX
PUSH CX
MOV BX,0
MOV SI,0
NEWCHAR :MOV AH,1
INT 21H
//中间判断范围的和结束符的略
SUB AL,30H ;这句把ASCII码转为二进制数 书上是这么说的!我觉得16进制 ?如果是二进制 那下面的语句是干嘛的?
CBW
XCHG AX,BX ;BX不是0吗?这一换AX不是0了吗?
MOV CX,10D
MUL CX ;就算AX还不是0 ,为什么能直接和十进制的数相乘呢?
XCHG AX,BX ;以下两句均不懂
ADD BX,AX
JMP NEWCHAR
希望 有心人为我仔细解释下 谢了

明白算法就会了
10进制转2进制的此例算法:初始为0,乘十加高位
如321,设转换后的值X为0
1,X=0*10+3=3
2,X=3*10+2=32
3,X=32*10+1=321!!!

MOV BX,0 ;初始设值X=0
MOV SI,0 ;没用到,不管它
NEWCHAR :MOV AH,1
INT 21H ;键盘输入数字
SUB AL,30H ;二进制是与十六进制只是表示不同而已,CPU工作在二进制下,但因此将代码全写成16个01(或32位CPU下的32个10)还不看晕你,别深究这问题
CBW ;将AL扩展成AX,值可没变啊!
XCHG AX,BX ;交换后BX=高位数字,AX=值X
MOV CX,10D
MUL CX ;值X*10,结果在DX:AX
XCHG AX,BX ;交换后,AX=高位数字,BX=中间的值X
ADD BX,AX ;乘十加高位,现在就差加高位这一步了,是不?加了以后值在BX中
JMP NEWCHAR ;现在BX的值可不是初始的0了,读下个数字继续乘十加高位,最后就会得到结果

那下面的语句是干嘛的?
CBW ;ah清零
XCHG AX,BX ;AX,BX的值互换
MOV CX,10D ;汇编后cx=0ah
MUL CX ;ax*0ah送回ax
XCHG AX,BX ;以下两句均不懂
ADD BX,AX ;bx+ax,结果送到bx
JMP NEWCHAR ;去接收下一数字。