“统计键盘输入字符、数字个数”
实验报告
一、实验目的
1、学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、了解和掌握程序设计过程中算法的选择。
4、掌握汇编语言的调试方法。
二、实验内容
从键盘输入一系列字符(每种字符不超过9)并以回车符结束,请统计出字母、数字及其它字符的个数,最后在屏幕上显示计数结果。
三、实验过程
1、编写程序,后附程序代码
2、测试程序
输入四组不同的测试字符串,得到NUMBER值为数字个数,CHAR值为字母个数,REST为符号个数。
三、结果分析和思考
结果分析:
由测试中可以看出,三种字符显示的个数范围是0~9,大于9之后的就会显示个数的数值加30H之后的数值对应的ASCII码值,这是因为显示个数的时候,我的思路是将个数分别存储在NUMBER,CHAR,REST中,然后显示它们的值加30H后所对应的ASCII码值,因此如果想要显示两位数、三位数的数值,就要在最后输出的时候改变输出的方法,将两位数、三位数的数值输出。
改进思路:
先将前面程序计算出的个数三位数放到AL中,然后调用除法指令DIV除以100得到百位数字,而后除以10得到十位数字,和余下的个位数字。就可以得到000~999显示范围的字符个数。
在调用除法的过程中,被除数在AX中,商在AL中,余数在AH中
以数字个数NUMBER为例:
MOV AL,NUMBER  将NUMBER送到AL
MOV AH,0  ;对应百位
MOV BL 100
DIV  BL
MOV BL,AH  ;余数在AH
MOV AH,2    ;显示最高位(除以100的余数为最高位,存在AH中)
ADD AL,30H 
MOV DL,AL 
INT 21H
MOV AL,BL  ;对应十位
MOV AH,0
MOV BL,10
DIV BL
MOV BL,AH  ;余数在AH
MOV AH,2  ;显示中间位(除以10的余数为中间位,存在AH中)
ADD AL,30H
MOV DL,AL
INT 21H
MOV DL,BL;对应个位数字
ADD DL,30H 
MOV AH,2  ;显示个位
INT 21H
四、代码
DSEG SEGMENT
    NUMBER DB 0            ;存储数字个数
    CHAR DB 0            ;字母个数
    REST DB 0            ;字符个数
    STR1 DB 'NUMBER:','$'  ;输出提示”NUMBER:”
    STR2 DB ' CHAR:','$'    ;输出提示”CHAR:”
    STR3 DB ' REST:','$'        ;输出提示”REST:”
DSEG ENDS
CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
    MOV AX,DSEG
    MOV DS,AX
    AGAIN:
    MOV AH,1
    INT 21H
    CMP AL,0DH ;判断字符是否为回车
    JZ EXIT    ;是回车,跳转到结束语句
    CMP AL,'0'  ;不是回车,判断是否大于’0’
    JNL NEXT1  ;大于‘0’,跳转到NEXT1
    INC REST      ; 小于’0’,是字符,REST自增1
    JMP AGAIN ;AGAIN循环
    NEXT1:
    CMP AL,'9' ;判断是否小于’9’
    JBE N1    ;小于9,是数字,跳转到N1
    CMP AL,65;大于9,不是数字,跟’a’比较
    JNL NEXT2 ;大于’a’,跳转到NEXT2
    INC REST ;小于’a’,是字符,REST自增1
    JMP AGAIN;返回循环
    NEXT2:
    CMP AL,90  ;跟’z’作比较
    JBE N2      ;小于’z’,是字母,跳转到N2
    CMP AL,97  ;大于’z’,跟‘A’比较
    JNL NEXT3  ;大于’A’跳转到NEST3
    INC REST    ;大于’z’,小于‘A’,是字符,REST自增1
    JMP AGAIN  ;返回循环
    NEXT3:
    CMP AL,122 ;跟’Z’比较
    JBE N2      ;小于’Z’,是大写字母,跳转到N2
    INC REST  ;不是字母,是字符,REST自增1
    JMP AGAIN  ;返回循环
   
    N1:
    INC NUMBER  ;判断为数字,NUMBER自增1
    JMP AGAIN    ;返回循环
    N2:
    INC CHAR    ;判断为字母,CHAR自增1
    JMP AGAIN  ;返回循环
    EXIT:
    LEA DX,STR1
    MOV AH,09H
    INT 21H                ;显示提示“NUMBER:”
    MOV DL,NUMBER        ;NUMBER送到DL
    ADD DL,30H
    MOV AH,2
    INT 21H                ;显示NUMBER的值
    LEA DX,STR2
    MOV AH,09H
    INT 21H                ;显示提示“CHAR:”
    MOV DL,CHAR            ;CHAR送到DL
    ADD DL,30H
    MOV AH,2
字符串截取数字部分    INT 21H                ;显示CHAR的值
    LEA DX,STR3           
    MOV AH,09H
    INT 21H                ;显示提示”REST:”
    MOV DL,REST            ;REST送到DL
    ADD DL,30H
    MOV AH,2
    INT 21H                ;显示REST的值
    MOV AH,4CH
    INT 21H                ;程序结束
CSEG ENDS
    END START

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。