80x86汇编语言程序错误分析

来源:互联网 发布:存货管理论文的数据 编辑:程序博客网 时间:2024/05/21 19:16

题目:编程从键盘接收一个字符串,存入STRING开始的内存缓冲区,要求统计该字符空格的个数,并在屏幕上统计结果。

运行结果有错的源程序如下:

DATA SEGMENT    ORG 1000    STRING DB 100           DB ?           DB 100 DUP(?)DATA ENDSCODE SEGMENT    ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA      MOV DS,AX      MOV DX,OFFSET STRING      MOV AH,10      INT 21H      MOV CX,100      MOV DL,0      LEA SI,STRINGNEXTCHAR:CMP CX,0h         JZ FINISH         MOV AL,[SI]         CMP AL,' '         JZ NEXT         DEC SI         DEC CX         JMP NEXTCHARNEXT:INC DL     DEC CX     JMP NEXTCHARFINISH:       MOV AH,2       INT 21H       MOV AH,4CH       INT 21HCODE 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
       incsi
     JMP NEXTCHAR
修改后,能正确运行的源程序代码如下,其中,小写部分,是我在修改时根据需要添加上去的。

;编程从键盘接收一个字符串,存入STRING开始的内存缓冲区,;要求统计该字符空格的个数,并在屏幕上统计结果。DATA SEGMENT;ORG 1000STRINGDB 100DB ?DB 100 DUP(?)DATA ENDSCODE SEGMENT    ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA      MOV DS,AXMOV DX,OFFSET STRINGMOV AH,10INT 21Hmov dl,0AHmovah,2int21hmovdl,0dHmovah,2int21h;MOV CX,100movcl,string+1MOV DL,0LEA SI,STRINGaddsi,2NEXTCHAR:;CMP CX,0hcmpcl,0JZ FINISHMOV AL,[SI]CMP AL,' 'JZ NEXTincsi;DEC CXdecclJMP NEXTCHARNEXT:INC DL    ;DEC CXdeccl      incsiJMP NEXTCHARFINISH:orDL,30HMOV AH,2INT 21H       MOV AH,4CHINT 21HCODE ENDS   END START