用汇编语言编写的代码,可以运行,但结果不对,自己也看不出错在哪里?求指导~~~

2025年03月01日 08:19
有1个网友回答
网友(1):

楼主,你的那段扫描字符是否是在42H和45H之间的代码简直是大错特错。
在扫描之前,BX的值是输入的字符个数。那么LAST: MOV AL,[BX+1]就是把输入的最后一个字符放到AL中。你用它跟42H和45做比较,下面的问题有三个:
1. 小于跳转指令你写成JC NEXT了,应该是JB NEXT
2. 扫描完最后一个字符,下一步应该是DEC BX,好往前扫,但是你用INC BYTE PTR [BX+1]只是使输入的最后一个字符加1,完全没有任何意义。
3.使用 LOOP LAST1,要提前设置好CX寄数器的值。

输出的那段程序,从你用RCL BX,1来看,分别是应该把COUNT放到BX中去,但是你在前面写的却是MOV DX,COUNT,这个地方应该是MOV BX,COUNT

下面是修改的代码:
.486
DATA SEGMENT USE16
BUF DB 255
DB ?
DB 255 DUP(?)
MESG DB 0DH,0AH,'$'
N1 DB 42H
N2 DB 45H
COUNT DW 0
DATA ENDS

CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H ;等待键入一串字符

MOV BL,BUF+1
MOV BH,0
MOV SI,OFFSET BUF+2
MOV BYTE PTR [BX+SI],'$'
MOV AH,09H
MOV DX,OFFSET MESG
INT 21H ;显示输入的字符串,并换行

MOV CX, BX;一共需要扫描的次数
LAST: MOV AL,[BX+1]
CMP AL,[N1]
JB NEXT
CMP AL,[N2]
JA NEXT
INC COUNT
NEXT: DEC BX
LOOP LAST ;寻找在42H~45H之间的字符并统计其个数

MOV BX,COUNT
MOV CX,16
LAST1: MOV DL,'0'
RCL BX,1
JNC NEXT1
MOV DL,'1'
NEXT1: MOV AH,2
INT 21H
LOOP LAST1

MOV AH,4CH
INT 21H
CODE ENDS
END BEG