求大神,以下代码略有不懂,求解释一下
CALLDOS MACRO FUNCTION ;宏定义 CALLDOS
MOV AH,FUNCTION
INT 21H
ENDM
CRLF MACRO ;换行
MOV DL,0DH
CALLDOS 2
MOV DL,0AH
CALLDOS 2
ENDM
DATA SEGMENT
MESSAGE DB 'Please input 10 number:',0DH,0AH,'$'
NUMBERS DB 10 DUP(?)
KB_BUF DB 3
ACTLEN DB ?
BUFFER DB 3 DUP(?) ;输入的字符放在次区域中
LE59 DB 0 ;0——5的个数
GE60 DB 0 ;60——79的个数
GE80 DB 0 ;80——99的个数
SORTSTR DB 'Sorted numbers'
SORTNUM DB 9 DUP(20H,20H,','),20H,20H,0DH,0AH
MESS00 DB '0-59:',30H,30H,0DH,0AH
MESS60 DB '60-79:',30H,30H,0DH,0AH
MESS80 DB '80-99:',30H,30H,0DH,0AH,'$'
DATA ENDS ;数据段结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA,ES:DATA
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,MESSAGE
MOV AH,09H
INT 21H ;显示MESSAGE
;从键盘读入数据并转化成二进制数保存
MOV CX,10
LEA DI,NUMBERS ;设置数据保存区指针
LP11:LEA DX,KB_BUF
MOV AH,0AH
INT 21H ;从键盘读入数据
CMP ACTLEN,0
JZ LP11 ;等于
CMP ACTLEN,1
JNZ LP12 ;不等于
MOV AL,BUFFER ;若只有一个数字
AND AL,0FH ; 转化成二进制
JMP LP13
LP12:MOV AH,BUFFER ;若有二个数字
MOV AL,BUFFER+1
AND AX,0F0FH ; 转化成BCD数
AAD ; 转化成二进制数
LP13:STOSB ; 把AL或AX中的数据存储到DI为目的串地址指针所寻址的存储单元中去
CRLF
LOOP LP11
MOV BL,9
LP21:LEA SI,NUMBERS
MOV CL,BL
LP22:LODSB ; ?第一个数Ni
CMP AL,[SI] ; Ni<=Nj?
JLE LP23 ; 若小于等于则不交换
XCHG AL,[SI] ; 否则交换Ni,Nj
MOV [SI-1],AL
LP23:DEC CL
JNZ LP22 ;若内循环未结束则继续
DEC BL
JNZ LP21 ;若外循环未结束则继续
;对NUMBERS中的10个数据进行统计,结果放在GE80,GE60和LE59中
LEA SI,NUMBERS ;指向数据保存区
MOV CX,10
LP31:CMP BYTE PTR[SI],60
JGE LP32
INC LE59
JMP LP34
LP32:CMP BYTE PTR[SI],80
JGE LP33
INC GE60
JMP LP34
LP33:INC GE80
LP34:INC SI
LOOP LP31
;把排序后的10个数据转换成ASCII码依次存入SORTNUM字符中串中
LEA SI,NUMBERS ; 指向数据保存区
LEA DI,SORTNUM ; 指向字符串
MOV CX,10
LP41:LODSB
CMP AL,10 ; 大于10,则有二位数字
JGE LP42
ADD AL,30H ; 只有一位数字则直接转换
MOV AH,20H ; 高位显示成空格
JMP LP43
LP42:AAM ; 转化成二位BCD数
ADD AX,3030H ;转化成ASCII码
LP43:XCHG AH,AL ; 十位数放到AL中
MOV [DI],AX
ADD DI,3
LOOP LP41
;把统计结果转化成ASCII码存入MESS80,MESS60,MESS00字符串中
MOV AH,LE59
CMP AH,10 ;大于10,则有二位数字
JGE LP51
ADD AH,30H ; 只有一位数字则直接转换
MOV AL,20H ;高位显示成空格
JMP LP52
LP51:MOV AX,3031H
LP52:MOV WORD PTR MESS00+6,AX
MOV AH,GE60
CMP AH,10 ; 大于10,则有二位数字
JGE LP53
ADD AH,30H ;只有一位数字则直接转换
MOV AL,20H ;高位显示成空格
JMP LP54
LP53:MOV AX,3031H
LP54:MOV WORD PTR MESS60+6,AX
MOV AH,GE80
CMP AH,10 ;大于10,则有二位数字
JGE LP55
ADD AH,30H ;只有一位数字则直接转换
MOV AL,20H ; 高位显示成空格
JMP LP56
LP55:MOV AX,3031H
LP56:MOV WORD PTR MESS80+6,AX
;;显示排序后的数据和统计结果
LEA DX,SORTSTR
CALLDOS 9
CALLDOS 1
CALLDOS 4CH ;返回DOS
CODE ENDS ;代码段结束
END START ;程序结束