题目:编程从键盘接收一个字符串,存入STRING开始的内存缓冲区,要求统计该字符空格的个数,并在屏幕上统计结果。
运行结果有错的源程序如下:
DATA SEGMENT
ORG 1000
STRING DB 100
DB ?
DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING
MOV AH,10
INT 21H
MOV CX,100
MOV DL,0
LEA SI,STRING
NEXTCHAR:CMP CX,0h
JZ FINISH
MOV AL,[SI]
CMP AL,' '
JZ NEXT
DEC SI
DEC CX
JMP NEXTCHAR
NEXT:INC DL
DEC CX
JMP NEXTCHAR
FINISH:
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
该程序在DOS下的运行情况,见下图。
从上面的截图可以看出,该程序,不能正确显示结果。
特别提醒读者注意一下,其实,程序是有显示的,是nioj...那一行的第一个字符。很显然,结果是不正确的。
该程序有下面的几个主要问题:
1)DL是计数值,在FINISH处,要输出这个值时,应该转换成对应数值字符的ASCII码;
2)修改SI的指令不对,为什么是DEC SI?而且,找到空格字符,跳转到NEXT处的语句块时,SI没有被修改。
3)输入字符串的10号功能调用后,要加一段代码,输出回车换行符;
4)要统计的字符的个数不应该是100,而应该是你实际输入的字符数,即保存在string+1单元。而这个单元是字节类型的,所以,计数寄存器选用CL就可以了。不能直接赋值给CX;
5)程序中,这3条指令是重复的,可以去掉一部分。读者可以自行分析一下,看看如何优化。
dec
cl
inc
si
JMP NEXTCHAR
;编程从键盘接收一个字符串,存入STRING开始的内存缓冲区,
;要求统计该字符空格的个数,并在屏幕上统计结果。
DATA SEGMENT
;ORG 1000
STRING DB 100
DB ?
DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING
MOV AH,10
INT 21H
mov dl,0AH
mov ah,2
int 21h
mov dl,0dH
mov ah,2
int 21h
;MOV CX,100
mov cl,string+1
MOV DL,0
LEA SI,STRING
add si,2
NEXTCHAR:
;CMP CX,0h
cmp cl,0
JZ FINISH
MOV AL,[SI]
CMP AL,' '
JZ NEXT
inc si
;DEC CX
dec cl
JMP NEXTCHAR
NEXT:
INC DL
;DEC CX
dec cl
inc si
JMP NEXTCHAR
FINISH:
or DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START