首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

求大神,以次代码略有不懂,求解释一下

2013-07-04 
求大神,以下代码略有不懂,求解释一下CALLDOS MACRO FUNCTION宏定义CALLDOSMOV AH,FUNCTIONINT 21HENDMCRL

求大神,以下代码略有不懂,求解释一下

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                                ;程序结束




CMP ACTLEN,0  这段代码的ACTLEN存储的是什么啊?不是定义之后没有进行存储的吗?

------解决方案--------------------


这个写法有点风骚 actlen在kb_buff后面的那个字节,用来检查kb_buff 输入长度,如果输入超过一个字节,则溢出到actlen的内存单元,actlen自然不为0,那么转入bcd码的那个字程序。

不过这样的风骚有个小问题,如果actlen的原来的内存位置碰巧不为0,可能就会出现想破头都想不出的错误。

热点排行