题目为:
编写完整程序:从键盘输入一系列字符,以字符‘$’为结束符,然后对其中的非数字字符计数(10个以内),并显示出计数结果。
我的代码如下:
DATA SEGMENT
INPUT DB 50H DUP(0) ;将输入内容存入这个
COUNT DB 0
DATA ENDS
STACK SEGMENT STACK
BUFFER DB 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS: DATA, SS: STACK, CS: CODE
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
MOV SP, 32
MOV COUNT, 0 ;计数器清零
LEA BX, INPUT
L_INPUT:
MOV AH, 01H
INT 21H
MOV [BX], AL
INC BX
CMP AL, '$'
JNZ L_INPUT ;对每次输入都进行判断,不是'$'则继续输入。
C_INPUT:
INC COUNT ;每扫描一个字符,计数器便加1,之后若扫描到数字则减1,最后剩下的数就是非数字的字符数
LEA BX, INPUT
MOV AL, [BX]
INC BX
CMP AL, '$'
JZ FINAL
CMP AL, 30H
JB C_INPUT
CMP AL, 39H
JA C_INPUT
SUB COUNT, 1 ;如果到这一步则说明扫描的这个是数字,将计数器减1
JMP C_INPUT
FINAL:
SUB COUNT, 1 ;去掉对'$'多算的一次
ADD COUNT, 30H ;根据ASCII码,要显示的是数字0-9
LEA DX, COUNT
MOV AH, 09H
INT 21
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
问题出在,执行程序时,我输入完'$'后,程序就卡死在那里了,非常郁闷。
我不知道是不是因为
LEA DX, COUNT
MOV AH, 09H
INT 21
这个显示指令不能被执行。。。
如果是这个原因的话,应该如何使数据段中存的内容以十进制或是十六进制显示出来呢。。
刚开始学汇编,指令学的还不多,差不多学到的都用在这个程序上了,希望能给出尽量易懂的代码(代码可以很多,易理解就行),谢谢了~~!
------解决方案--------------------
LEA BX, INPUT 应该放在 C_INPUT: 之前吧,不然后面过来循环,每次都重置 BX 使得 BX 一直指向第一个字符,故而就死循环了。
COUNT 定义后面应该加个 '$' 字符成 COUNT DB 0, '$',否则就应用字符显示的功能调用而非 ah=9 的字符串显示功能。
接下来的 int 21 漏了十六进制后缀的 h 会变成调用 int 15h 了。
这个显示方法只适合个数不超过 9 的个位形式情况吧。