8086系列(7):字符串分类计数

题目

从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示出这三类的计数结果。

思路

分支的极致运用,按照ASCII码由小到大进行比较,有点麻烦。详细解释见代码。

代码

datasg segment
    ALPHABET db 'alaphabet:','$'
    NUMBER db 'number:','$'
    OTHER_ db 'other:','$'
    CRLF db 13,10,'$'
datasg ends
;------------
codesg segment
    assume cs:codesg,ds:datasg,es:datasg
main proc far
start:
    push ds
    sub ax,ax
    push ax
    mov ax,datasg
    mov ds,ax
    mov es,ax
;-------------
begin:
    mov bx,0  ;字母字符计数器
    mov si,0  ;数字字符计数器
    mov di,0  ;其他字符计数器
input:
    mov ah,1  ;调用1号中断输入一个字符
    int 21h   ;存放于al中
    cmp al,13  ;是回车吗?
    je disp    ;display
    cmp al,30H  ;小于数字0吗?
    jae next1   ;大于数字0
OTHER:          ;小于数字0的一定是其他字符
    inc di
    jmp short input
next1:
    cmp al,39H   ;大于数字9吗?
    ja next2    ;不是数字
    inc si       ;不大于,是数字
    jmp short input
next2: 
    cmp al,41H   ;小于字母A吗
    jae next3    ;大于字母A
    jmp short OTHER  ;小于字母A又不是数字
next3:
    cmp al,5AH    ;大于字母Z吗
    ja next4     ;大于字母Z
    inc bx      ;是字母A-Z
    jmp short input
next4:
    cmp al,61H     ;小于字母a吗
    jae next5     ;大于字母a
    jmp short OTHER  ;大于字母Z小于字母a是其他字符
next5:
    cmp al,7AH    ;大于字母z吗
    ja short OTHER  ;大于字母z是其他字符
    inc bx         ;是字母a-z
    jmp short input

disp:
    lea dx,ALPHABET  ;准备显示字母
    call display
    lea dx,NUMBER    ;准备显示数字
    mov bx,si      ;si存放数字的值
    call display
    lea dx,OTHER_    ;准备显示其他字符
    mov bx,di     ;di存放其他字母的值
    call display
    ret
main endp    ;主函数结束

;-----display子程序----
display proc near
    mov ah,09H   ;显示字符串
    int 21h
    call binihex   ;把bx中的二进制数转换为16进制显示
    lea dx,CRLF
    mov ah,09h    ;显示回车换行
    int 21h
    ret
display endp
;-----display子程序----

;-----bx中的数十六进制数显示子程序-----
binihex proc near
    mov ch,4   ;4位16进制数
rotate:
    mov cl,4
    rol bx,cl   ;循环左移,从高位到低位依次显示
    mov dl,bl
    and dl,0FH  ;取出最低位
    add dl,30H
    cmp dl,3AH  ;是A-F吗
    jl print_it
    add dl,07h
print_it:
    mov ah,02h
    int 21h
    dec ch
    jnz rotate
    ret
binihex endp
;-----bx中的数十六进制数显示子程序-----

;-------------
codesg ends
end start

调试

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值