• 汇编语言程序设计之二


    从键盘输入一系列字符(以回车结束),按数字,大小写字母分类计数,并在屏幕上打印出来。

    
    DATA    SEGMENT
            INFOR1  DB 0AH,0DH,"Please Press Any Key to input a letter:$"
            INFOR2  DB 0AH,0DH,"Lowercase Letter : $"
            INFOR3  DB 0AH,0DH,"Uppercase Letter : $"
            INFOR4  DB 0AH,0DH,"Digit : $"
            INFOR5  DB 0AH,0DH,"Other Letter : $"
    DATA    ENDS
    CODE    SEGMENT
          ASSUME CS:CODE,DS:DATA
    START:  
    PRINT MACRO STR,RHS  ; MACRO 为宏
        LEA DX,RHS
        MOV AH,09H
        INT 21H
        MOV DL,STR 
        ADD DL,30H
        MOV AH,02H 
        INT 21H 
    ENDM
            MOV  AX,DATA
            MOV  DS,AX
    
            MOV  DX,OFFSET INFOR1
            MOV  AH,09H
            INT 21H 
    
            MOV BX,0 
            MOV CX,0
    XUNHUAN:
        MOV AH ,01H
        INT 21H ;AL 
        CMP  AL,0DH ; 
    
        JZ  DISPLAY
    
        CMP  AL,'0'
        JB   OTHER
        CMP  AL,'9'
        JBE  DIGIT
    
        CMP  AL,'A'
        JB   OTHER
        CMP  AL,'Z'
        JBE  UPPER
    
        CMP  AL,'a'
        JB   OTHER
        CMP  AL,'z'
        JBE  LOWER
    
        JMP  XUNHUAN 
        LOWER:
            INC BL
            JMP XUNHUAN ;     
        UPPER:  
            INC BH
            JMP  XUNHUAN        
        DIGIT:  
            INC CL
            JMP  XUNHUAN        
        OTHER:  
            INC CH 
            JMP  XUNHUAN    
        DISPLAY:
            PRINT BL,INFOR2
            PRINT BH,INFOR3
            PRINT CL,INFOR4
            PRINT CH,INFOR5
            MOV  AH,4CH
            INT  21H
    CODE    ENDS
    END  START

    这里写图片描述

    小结:

    1. 如何判断回车符号?

    回车符(跳转到本行开头)    0DH
    换行符(到下一行)         0AH 
    

    2. 在输出的时候记得加上30H,用来以ASCII码的形式输出

    2.输入一段数字字符,将其转换为数值,然后从1加到该数值,最后以十进制数值形式输出总和

    DATA SEGMENT 
        INF1  DB 0AH,0DH,"PLEASE INPUT A NUMBER (0~361): $"
        MSG2  DB 0AH,0DH," 2 Hexadecimal  : $"
        MSG3 DB  0AH,0DH,"THE SUM(1+2+3+....) IS : $"
        IBUF DB  100,0,100 DUP('$')
        OBUF DB  6 DUP(?)
    DATA ENDS
    CODE SEGMENT 
        ASSUME CS:CODE ,DS:DATA 
    START:
    PRINT_MSG MACRO parameter
        LEA DX,parameter
        MOV AH,09H
        INT 21H 
    ENDM
        MOV AX,DATA 
        MOV DS,AX 
    
        PRINT_MSG INF1 
    
        LEA DX,IBUF ;输入一个十进制数字(<361 )
        MOV AH,0AH
        INT 21H 
    
        MOV CL,IBUF+1 
        MOV CH,0 
    
        MOV AX,0
        LEA SI,IBUF+2 
    AGAIN: 
        MOV DX,10
        MUL DX 
        ;如果参数是字节,将把 AL 做乘数, 结果放在 AX
        ;如果参数是字 , 将把 AX 做乘数, 结果放在 DX:AX
        AND BYTE PTR [SI],0FH 
        ADD AL,[SI] 
        ADC AH,0
    
        INC SI 
        LOOP AGAIN 
    
     ; AX  中存放累加和
     ; BX  用来存放每次要加的数值
        MOV CX,AX 
        MOV AX,0
        MOV BX,1
    LOOP2:
        ADD AX,BX
        INC BX
        LOOP LOOP2 
    
        MOV BX,OFFSET OBUF+5 
        MOV BYTE PTR [BX],'$'
        MOV CX,10 
    LOOP1:
        MOV DX,0
        DIV CX 
        ; 被除数默认存放在 AX 中 
        ; 除数是8位, 则被除数为 AX,    AL 存储商,AH 储存余数
        ; 除数是16位,则被除数为 DX:AX ,AX 储存商,DX 储存余数
        ADD DL,30H 
        DEC BX
        MOV [BX],DL
        OR AX,AX
        JNZ LOOP1;
    
        PRINT_MSG MSG3
        MOV DX,BX 
        MOV AH,09H
        INT 21H
    
        MOV AH,4CH
        INT 21H
        CODE ENDS 
    END START 

    这里写图片描述

    小结:

    1. MUL 乘法指令

    如果参数是字节,将把 AL 做乘数, 结果放在 AX
    如果参数是字 , 将把 AX 做乘数, 结果放在 DX:AX
    

    2. ADC 指令

    1. 要求低位字节相加,高位字节再相加时就要考虑低位相加的进位,即CF,这时就要用到ADC指令。
        ADD AL,[SI] 
        ADC AH,0

    3. 为什么不能超过 361 ?

    因为从1加到361,会是65341,再大的话会超出AX的存储范围。

    4. DIV 指令

    除数是8位, 则被除数为 AX,    AL 存储商,AH 储存余数
    除数是16位,则被除数为 DX:AX ,AX 储存商,DX 储存余数
    
  • 相关阅读:
    相关系数的元分析,以及带调节变量的相关系数的元分析(R)
    共有地址网段类别的划分,几个特殊的私有地址,关于子网掩码,网关的小知识 (网络)
    在文件内夹内部建立子文件夹(python)(os)
    晶振, 机器周期,进位 (单片机)
    数码管动态显示,显示从1到9,每一位显示一个数字 (单片机)
    比较R平方的差值,比较两个回归方程的(R)
    react项目控制台报错data.slice.is not function
    useRef源码
    useReducer源码实现
    useContext源码解读
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335287.html
Copyright © 2020-2023  润新知