需求:在存储器中以首地址BUF开始存有一串字符,字符串个数用count表示。要求统计数字0-9 字符A-Z和其他的个数,

并分别将他们的个数存储到NUM开始的3个内存单元中。

编程思路:我们知道数字0-9对应的ascll为30h-39h 大写字母 41h-5ah 数据段中定义 buf存储一串字符,count判断出自总字符的个数。num 定义3个重复的字节空间,分别用来存放数字 字母 其他字符的个数、在代码段中段地址和偏移地址赋值,然后将字符串的总个数获取到。存储到寄存器ch中。dx中高8位用来存储数字的个数,低8位用来存储大写字母的个数

然后获取第一个数,去判断是否是cmp al,30h 小于的话 说明这个数字是一个其他字符 程序跳转到next cmp al,39 大于 跳转到abc处 因为 这个字符有可能是一个大写的字母,两种情况都不是的话,这个字符就是一个数字因此 inc dh。

如果这个字符是一个大于39的字符 跳转到abc处,先判断cmp ah,41h 小于 跳转到 next,否者的话 cmp ah,5ah 高于的,跳转到next 。上面两种情况都不属于的话,int dl

最后程序 执行到next处,这时可以确信这个字符 是一个既非数字 也非大写字母的字符。先将基地址加1 字符串的个数减1

(这块为什么字符串的个数要进行减1,其实是出于程序循环次数来判断 ch中存放着字符的个数,每次判断结束完 就应该进行减一 用jz去判断程序是否执行完。)将dh 和 dl中个数赋值给num num[1] 程序最关键的位置就这步,上面我们已经获取到数字和大写字母的个数,那么其他字符的个数,怎么去获取。此时 我们已经知道了总字符的长度 ,通过总字符的长度减去数字和大写字母的个数,就可以获取到其他字符的个数,然后 通过mov指令存储到num[2]位置上。嗯  我的理解就是这样。

;在存储器中以首地址BUF开始存有一串字符,字符串个数用count表示
;要求统计数字0-9 字母A-Z和其他字符的个数,并分别将他们的个数存储到NUM开始的3个内存单元中去
;程序分析 数字0-9 ascll为30h-39h  大写字母 A-Z 的ASCLL为41h-5Ah 
data segment 
     buf db 'paint' 'abc',35h,52h,30h,08h  ;一串字符
     count equ $-BUF  ;count = 字符总个数
     num db 3 dup(?)  ;先存放数字 字母 其他字符个数
 data ends
 code segment 
    assume cs:code,ds:data
    start:mov ax,data
          mov ds,ax
          mov ch,count  ;ch-数组长度
          mov bx,0      ;bx为基址指针 初值清0
          mov dx,0      ;dh -数字个数 dl字母个数  初值清0
    loop1:mov ah,buf[bx]  ;取第一个数
          cmp ah,30h    ;<30h
          jl  next
          cmp ah,39h    ;>39
          jg  abc 
          inc dh
          jmp next
       abc:cmp ah,41h  ;41h
          jl next ;非字母 转
          cmp ah,5ah;>5ah
          jg next ;非字母 转
          inc dl ;字母个数加1
       next:inc bx;基地址指针加1
          dec ch;字符串减1
          jz  loop1 ;未完 取下一个数
          mov num,dh ;已完
          mov num+1,dl
          mov ah,count 
          sub ah,dh
          sub ah,dl          ;计算出其他字符个数
          mov num+2,ah     
          mov ax,4c00h
          int 21h
       code ends
 end start