80x86汇编习题
题目描述:从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。
思路:
有两种思路,一种是先输出,后计数;另一种是边输入,边计数。本文是用前者。
1,逐个字符输入到BUFF,指针后移,判断是否为'$',是则结束输入
2,逐个判断数组内容是否为数字,是则计数
3,输出计数内容
这个程序写得并不好,因为我做了偷懒处理,默认它输出的数字字符数是少于10个。
根据题目理解,最好的做法应该是:逐个输入,立刻判断,计数器+1,下一个输入遇到$结束。然后用十六进制输出计数器的内容。
DATAS SEGMENT
BUFF DB 10 DUP(?)
DATAS ENDS
STACKS SEGMENT
DW 100H DUP(?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP ;初始化
LEA BX,BUFF ;缓冲区首
INPUTT:
MOV AH,1
INT 21H
MOV [BX],AL ;输入一个字符
INC BX ;指针+1
CMP AL,'$' ;是否是$
JNE INPUTT ;不是就继续输入
LEA BX,BUFF ;移动指针到头部
XOR CX,CX ;清空计数器
COU:
MOV AL,[BX] ;移动到AL
INC BX ;指针加1
CMP AL,'$' ;是否为结束符
JE DISP ;结束就跳到输出
CMP AL,'0' ;是否小于0
JB INCC ;小于0,跳转到CX+1
CMP AL,'9' ;是否大于9
JA INCC ;大于9,跳转到CX+1
JMP COU ;在0-9之间,移动到下一位
INCC:
INC CX ;非数字字符+1
JMP COU ;
DISP:
MOV DX,CX
ADD DL,'0'
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START