用汇编语言编写,先显示信息“INPUTSTRING,THE END FLAG IS $”再接收字符。如为0-99,则计数器加1,并显示计数,如为非数字,则直接显示,但不计数。
时间: 2023-08-09 20:10:10 浏览: 115
汇编 按小写字母、数字字符和其他字符分类计数,最后分别显示出这三类字符的计数结果
以下是汇编代码:
```
.MODEL SMALL
.STACK 100H
.DATA
msg1 DB 'INPUT STRING, THE END FLAG IS $', 0AH, 0DH, '$'
msg2 DB 'COUNT: $'
count DW 0
input DB 10, ?, '$'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 显示提示信息
MOV AH, 09H
LEA DX, msg1
INT 21H
; 循环读入字符
MOV AH, 01H
MOV CX, 100
MOV SI, 0
READ_LOOP:
INT 21H
CMP AL, '$' ; 判断是否到达结束符
JE END_READ
; 判断是否为数字
CMP AL, '0'
JB SHOW_CHAR
CMP AL, '9'
JA SHOW_CHAR
; 计数器加1
ADD count, 1
; 将输入的字符转换为数字
SUB AL, '0'
MOV BL, 10
MUL BL
MOV BH, 0
ADD SI, AX ; 将数字累加到SI寄存器中
; 显示计数结果
MOV AH, 09H
LEA DX, msg2
INT 21H
MOV AX, count
CALL DISPLAY_NUM
JMP READ_LOOP
END_READ:
; 显示最终计数结果
MOV AH, 09H
LEA DX, msg2
INT 21H
MOV AX, count
CALL DISPLAY_NUM
MOV AH, 4CH
INT 21H
MAIN ENDP
; 显示数字的子程序
DISPLAY_NUM PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 0
MOV BX, 10
; 计算数字的位数
CALC_DIGITS:
INC CX
DIV BX
TEST AX, AX
JNZ CALC_DIGITS
; 将数字转换为字符串
MOV BX, 0
MOV DX, CX
CONVERT_LOOP:
DEC DX
XOR AH, AH
DIV BX
ADD AX, '0'
MOV msg2[DX+2], AL
CMP DX, 0
JNE CONVERT_LOOP
; 显示字符串
MOV AH, 09H
LEA DX, msg2
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY_NUM ENDP
END MAIN
```
代码解释:
1. 首先定义了需要显示的字符串和计数器变量;
2. 然后通过 BIOS 中断 21H 的 09H 功能,显示提示信息;
3. 循环读取字符,如果读到结束符 `$`,则跳出循环;
4. 判断是否为数字,如果是,则计数器加1,并将输入的数字累加到 SI 寄存器中;
5. 如果不是数字,则直接显示;
6. 在显示计数结果时,将计数器的值传递给一个子程序 `DISPLAY_NUM`,该子程序将计数器的值转换为字符串并显示;
7. 最后再一次显示计数结果;
8. 程序结束。
需要注意的是,由于汇编语言不支持直接将数字转换为字符串,因此需要编写一个子程序 `DISPLAY_NUM` 来实现该功能。该子程序的实现过程为:
1. 首先通过除法运算计算出数字的位数;
2. 然后倒序将数字转换为字符串;
3. 最后通过 BIOS 中断 21H 的 09H 功能,显示字符串。
在主程序中调用 `DISPLAY_NUM` 子程序时,需要将计数器的值存入 AX 寄存器中,再调用子程序。
阅读全文