谁给我解释一下以下代码(汇编十进制转二进制).

来源:百度知道 编辑:UC知道 时间:2024/05/14 08:29:09
DATAS SEGMENT
INF1 DB "PLEASE INPUT A NUMBER(0-65536)$:"
IBUF DB 7,0,6 DUP(77H)
DATAS ENDS
START:
MOV DX,OFFSET INF1
MOV AH,09H
INT 21H
MOV DX,OFFSET IBUF
MOV AH,0AH
INT 21H
MOV CL,IBUF+1
MOV CH,0
MOV SI,OFFSET IBUF+2
MOV AX,0
AGAIN:
MOV DX,10
MUL DX
AND BYTE PTR[SI],0FH
ADD AL,[SI]
ADC AH,0
INC SI
LOOP AGAIN

DATAS SEGMENT
INF1 DB "PLEASE INPUT A NUMBER(0-65536)$:" ;提示信息
IBUF DB 7,0,6 DUP(77H);键盘接收缓冲区
DATAS ENDS
START:
MOV DX,OFFSET INF1 ;3条指令的功能为在屏幕上显示提出信息字符串
MOV AH,09H
INT 21H
MOV DX,OFFSET IBUF ;3条指令的功能为从键盘接收字符串
MOV AH,0AH
INT 21H
MOV CL,IBUF+1;2条指令的功能为将实际接收的字符数存入CX
MOV CH,0
MOV SI,OFFSET IBUF+2 ;将存储实际接收字符的首地址送SI
MOV AX,0 ;
AGAIN:
MOV DX,10 ;2条指令的功能为(AX)<=(AX)*10
MUL DX ;
AND BYTE PTR[SI],0FH ;将相应存储单元中的字符ASCII转换为数字
ADD AL,[SI];2条指令的功能为(AX)<=(AX)+数字
ADC AH,0;
INC SI ;调整SI指向下一个单元
LOOP AGAIN;循环执行,完成(AX)<=(AX)*10+[SI]

举例说明:如果从键盘接收123,则IBUF中依次存放7,3,31H,32H,33H
首先(AX)=0,(CX)=3,取出第一个字符ASCII31H,转换成相应数字1,利用(AX)<=(AX)*10+1=0*10+1=1;然后取出第二个字符ASCII32H,转换成相应数字2,利用(AX)<=(AX)*10+2=1*10+2=12;最后取出第三个字符ASCII33H,转换成相应数字3,利用(AX)<=(AX)*10+3=12*10+3=123。
注意:在计算机中十进制数123是以二进制数存储的,所以此程序是将屏幕输入的字符123利用(AX)<=(AX)*10+[SI]转换为二进制数。