📄 4.asm.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 + -