57 lines
1.9 KiB
NASM
Executable File
57 lines
1.9 KiB
NASM
Executable File
DATA SEGMENT
|
||
CHAR DB 'A'
|
||
HINT1 DB 'Please enter a string: $'
|
||
HINT2 DB 10, 27H, 'A', 27H, ' occured time: $'
|
||
TIMES DB 0
|
||
MAXLEN DB 100
|
||
LEN DB 0
|
||
TABLE DB 100 DUP (0)
|
||
DATA ENDS
|
||
|
||
CODE SEGMENT
|
||
ASSUME CS:CODE, DS:DATA
|
||
|
||
START:
|
||
MOV AX, DATA
|
||
MOV DS, AX
|
||
|
||
MOV DX, OFFSET HINT1 ; 将HINT1的偏移地址赋给DX准备输出
|
||
MOV AH, 9 ; 输出
|
||
INT 21H
|
||
|
||
LEA DX, MAXLEN ; 0AH功能会获取DS:[DX](已定义为MAXLEN)作为输入缓冲区最大容量
|
||
MOV AH, 0AH ; 调用0AH功能,将输入的字符串长度存入DS:[DX+1](已定义为LEN)
|
||
INT 21H ; 将字符串存入从DS:DX+2开始的空间(已定义为TABLE)
|
||
|
||
CALL CNT ; 统计字符“A”的数量,结果在TIMES中
|
||
MOV DX, OFFSET HINT2 ; 将HINT2的偏移地址赋给DX准备输出
|
||
MOV AH, 9 ; 输出
|
||
INT 21H
|
||
|
||
MOV AL, TIMES
|
||
ADD AL, '0' ; TIMES += '0' (将数字信息转换成字符)
|
||
MOV DL, AL
|
||
MOV AH, 02H ; 显示单个字符
|
||
INT 21H
|
||
|
||
MOV AH,4CH
|
||
INT 21H
|
||
|
||
CNT PROC NEAR
|
||
MOV CX, 0
|
||
MOV CL, LEN
|
||
MOV SI, -1 ; SI是遍历TABLE的下标
|
||
MOV AL, CHAR ; 要比较的字符移到AL中(CMP不能比较两个内存单元)
|
||
LP:
|
||
INC SI
|
||
CMP AL, TABLE[SI]
|
||
JNE BACK ; 不相等则跳过INC TIMES,重新循环
|
||
INC TIMES
|
||
BACK:
|
||
LOOP LP ; LOOP先将CX -= 1,然后判断是否为0,为0就退出循环
|
||
RET
|
||
CNT ENDP
|
||
|
||
CODE ENDS
|
||
END START
|