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

题目:编程从键盘接收一个字符串,存入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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ntGrace

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值