汇编 字符串统计 大写 小写 数字 其他

字符串统计

DATAS SEGMENT
  buf db '12ADdf#gh592HKL*','$'
  tp1 db 0;大写字母个数
  tp2 db 0;小写字母个数
  tp3 db 0;数字的个数
  tp4 db 0;其他字符的个数

  str1 db 'the number of big is:','$'
  str2 db 'the number of small is:','$'
  str3 db 'the number of number is:','$'
  str4 db 'the number of other is:','$'
  str5 db 0dH,0aH,'$';换行

DATAS ENDS

STACKS SEGMENT
  ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS
  START:
    MOV AX,DATAS
    MOV DS,AX

    lea si, buf
    mov cx, 16;设置循环次数

     again:
      ;字符串结尾,结束程序
      cmp byte ptr[si],'&'
      je exit

      ;0-9
      cmp byte ptr[si],30h;小于30,其他字符加1
      jb L1
      cmp byte ptr[si],39h;大于39进一步比较
      jbe L2

      cmp byte ptr[si],41h
      jb L1
      cmp byte ptr[si],5AH
      jbe L3

      cmp byte ptr[si],61h
      jb L1
      cmp byte ptr[si],7AH
      jbe L4


    L1:
      inc tp4
      jmp L5
    L2:
      inc tp3
      jmp L5
    L3:
      inc tp1
      jmp L5
    L4:
      inc tp2
      jmp L5
    L5:
      add si,1
      loop again



    ;显示大写字母
    lea dx,str1
    mov ah,09h
    int 21h

    mov bl,tp1
    call disp ;调用子程序

    mov ah,09h
    lea dx,str5
    int 21h

    ;显示小写字母
    lea dx,str2
    mov ah,09h
    int 21h

    mov bl,tp2
    call disp ;调用子程序

    mov ah,09h
    lea dx,str5
    int 21h

    ;显示数字
    lea dx,str3
    mov ah,09h
    int 21h

    mov bl,tp3
    call disp ;调用子程序

    mov ah,09h
    lea dx,str5
    int 21h

    ;显示其他
    lea dx,str4
    mov ah,09h
    int 21h

    mov bl,tp4
    call disp ;调用子程序

    mov ah,09h
    lea dx,str5
    int 21h


    exit:
      MOV AH,4CH
      INT 21H

  disp PROC ;显示BX中的数
    mov ch,4
    roll:

      mov cl,4
      rol bx,cl
      mov dl,bl
      and dl,0fh
      cmp dl,9
      jbe next1
      add dl,07h
    next1:

       add dl,30h
      mov ah,02h
      int 21h
      dec ch
      jnz roll
    RET
  disp ENDP

CODES ENDS
  END START

2

datas   segment
  letter   db   ?
  digit    db   ?
  other    db   ?
  string   label  byte
           max db 80 
           act db ?  
           str db 80 dup(?)
print   db  13,10,'Please enter the string:','$'
mess1   db  13,10, 'The total number of letter : ','$'
mess2   db  13,10,'The total number of digit  : ','$'
mess3   db  13,10,'The total number of other character : ','$'
datas   ends

code  segment
      assume  cs:code,ds:datas
start: push  ds
       sub  ax,ax
       push  ax
       mov   ax,datas
       mov   ds,ax
       mov   es,ax
       mov   letter,0
       mov   digit,0
       mov   other,0
       lea   dx,print
       mov   ah,09h  
       int   21h
       lea   dx,string
       mov   ah,0ah
       int   21h
       sub   ch,ch
       mov   cl,[string+1]
       lea   si,string+2
	   
digitseg: 
       mov   al,[si] ;数字判断,小于0为其他,0到9为数字
       cmp   al,'0'
       jb    otherseg
       cmp   al,'9'
       ja    letterseg    
       inc   digit
       jmp   loop1
	   
letterseg: 
       cmp   al,'A' ;大写字母判断,9之后,大于9,小于A为其他,A到Z为字母
       jb    otherseg   						
       cmp   al,'Z'
       ja    letter2seg 
       inc   letter
       jmp   loop1  
	   
letter2seg:  
       cmp   al,'a' ;小写字母判断,大于Z,小于a为其他,a到z为字母
       jb    otherseg
       cmp   al,'z'
       ja    otherseg
       inc   letter
       jmp   loop1
otherseg: 
       inc   other ;上文中未被识别出的字符均为其他
	   
loop1:  
       inc   si
       dec   cl
       cmp   cl,0
       jz    print1 
       jne   digitseg 
	   
print1:   
       lea   dx,mess1 ;输出mess1,字母
       mov   ah,09h
       int   21h
	   
       mov   al,letter 
       call  disp
	   
       lea   dx, mess2 ;输出mess2,数字
       mov   ah,09h
       int   21h
       mov   al,digit
       call  disp
	   
       lea   dx, mess3 ;输出mess3,其他
       mov   ah,09h
       int   21h
       mov   al,other
       call  disp
exit:
       mov  ah, 4ch
       int  21h
disp:                 						;十进制数形式显示AL中的内容.
       mov  ah, 0
       mov  bl, 10
       div  bl        						;div 无符号:div src 16位操作:商ax=(dx,ax)/src,余数dx
       add  al, 30h   						 ;比如说al=15h,即21,表示letter数量,然后,这个过程就是,ax=0015h(21),除以bl,bl值为10
       mov  dl, al     						 ;则除完了的结果为2余1,则ah=01,al=02,即ax=0102h;,那么al+30h即为表示该数字的ASCII码值,因为0的ASCII值为30h
       mov  bh, ah      					 ;则ax=0132h,dl=32,bh=01;
       mov  ah, 02h     					 ;显示输出dx,则显示32码对应的数字,2
       int  21h           
       mov  al, bh      						  ;把01给al,然后算出ASCII码,然后给dx,然后显示
       add  al, 30h
       mov  dl, al        
       mov  ah, 02h
       int  21h     
       ret
code   ends
       end   start

代码仓库:https://github.com/SKPrimin/HomeWork/tree/main/Assembly/StringStatistics

程序运行

汇编 字符串统计 大写 小写 数字 其他

1 2 3 A B c , . ?
letter 1 2 3
digit 1 2 3
other 1 2 3

与事实相符。

上一篇:javascript – Discord.js setGame()不再工作了


下一篇:c#-SSIS脚本组件作为源抛出System.NullReferenceException