汇编语言程序设计之二

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


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 ; \n
    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 储存余数
posted @ 2018-06-28 21:03  Tattoo_Welkin  阅读(183)  评论(0编辑  收藏  举报