⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.asm.bak

📁 检查一串字符中每个字符出现的次数外加流程图说明文档
💻 BAK
字号:
;从键盘上输入一串密码,计算每个字符出现的次数,并在屏幕上显示这个数字 
;bl计数器查字符个数,cx计数器查循环个数
DATA SEGMENT
BUFFER DB 100
       DB ?
       DB 100 DUP(?)
CHARS DB 'please enter you password(no more than 16 bits small english char):',0dh,0ah,'$'
DATA ENDS

CODE SEGMENT
     ASSUME CS:CODE,DS:DATA

MAIN
     MOV AX,DATA
     MOV DS,AX
START: 
     MOV DX,OFFSET CHARS
     MOV AH,9
     INT 21H                             ;输出chars目标ds:dx
     
     MOV DX,OFFSET BUFFER
     MOV AH,0AH
     INT 21H                             ;读入buffer
     
     MOV DL,0AH
     MOV AH,2
     INT 21H                             
     MOV DL,0DH
     MOV AH,2
     INT 21H                             ;回车
     
     MOV SI,OFFSET BUFFER    ;si to len
     INC SI           ;si to fact len
     MOV AL,[SI]      ;fact len送al
     INC SI           ;si to frist char
     MOV DL,[SI]       
     MOV DH,[SI]      ;to2中要与前面出现
     MOV DI,SI        ;;si to frist char
     MOV CL,AL        
     MOV CH,0         ;cx=100
     MOV BL,1
     MOV BH,0         ;bx=1相当于计数器
     DEC CL           

GO1: INC SI           ;si to输入字符串的第二个字母
     CMP DL,[SI]
     JNE TO1          ;不等 跳转to1
     INC BL           ;equ count++
TO1: LOOP GO1
     CALL OUTPUT
     MOV BL,1

TO5: INC DI            ;to 2nd char
     DEC AL            ;数值为实际长度-1
     CMP AL,1
     JE TO3            ;¥¥只有两个字符跳转to3¥¥
     CMP DH,[DI]       ;找到与上一个字符不同的第一个字符,di为指针
     JE TO5
     MOV DL,[DI]       ;将第一个不同的字符送dl
     MOV SI,DI         ;si to [dl]
     MOV CL,AL        
     MOV CH,0
     DEC CL            ;计数器数值为剩余字符长度
     
GO2: INC SI            ;si指向找到的第一个不同字符的下一个字符
     CMP [SI],DL      ;[si]与找到的第一个不同字符比较
     JNE TO2
     INC BL
     MOV [SI],DH       ;将第一个输入字符送[si],¥¥此为主要算法:用第一个字符覆盖与所比较的字符相同的字符¥¥
TO2: LOOP GO2          
     CALL OUTPUT       ;output: char number
     MOV BL,1          
     JMP TO5

TO3: CMP DH,[DI]       ;用于最后一个字符的情况
     JE TO4            ;最后一个字符与第一个字符比较
     MOV DL,[DI]       ;不等 将最后一字符送dl
     MOV BL,1
     CALL OUTPUT       ;功能号2显示单个字符作用寄存器为dl

TO4: MOV  AH,4CH
     INT  21H
 


OUTPUT PROC
     PUSH AX
     PUSH CX
     PUSHF            ;flags进栈
     
     MOV AH,2
     INT 21H          ;dl=第一个字符
     MOV DL,20H       ;空格 
     MOV AH,2 
     INT 21H          ;output 第一个字符和一个空格
     
     MOV AL,BL        ;第一个字符的个数
     MOV AH,0
     MOV CL,10
     DIV CL           ; al div 10商在al余数在ah
     ADD AH,30H
     ADD AL,30H       ;余数和商转换为相应的ASCII码
     
     MOV CH,AH        
     
     MOV DL,AL
     MOV AH,2
     INT 21H          ;output 商
                    
     MOV DL,CH
     MOV AH,2
     INT 21H          ;output 余数
     
     MOV DL,0AH
     MOV AH,2
     INT 21H
     MOV DL,0DH
     MOV AH,2
     INT 21H          ;回车
     
     POPF 
     POP CX 
     POP AX
     RET
OUTPUT ENDP
CODE   ENDS
       END MAIN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -