60行的小程序改错
要求是在str1串中寻找字符‘A’,若找到则删除,若找不到,则显示find fail,用串操作完成,并能循环输入
我写的程序如下,但是什么不输入的时候他显示:
2
输入2的时候显示:
find fail
输入12345A678能显示正确结果
输入123A的时候却显示:
2♦123
输入123456A789时显示:
2
123456 789
谁能提供一下修改意见,把程序改好
程序如下:
DATAS SEGMENT USE16
BUF1 DB 'PLEASE INPUT A STRING:$ '
BUF2 DB 'FIND FAIL$ '
BUF3 DB 0AH,0DH, '$ '
BUF4 DB 'PRESS C TO CONTINUE, PRESS ANYOTHER KEY TO BACK(C/?):$ '
STR1 DB 50
DB ?
DB 50 DUP(0)
DATAS ENDS
STACKS SEGMENT USE16 STACK
DB 200 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
INOUT MACRO BUF,N
LEA DX,BUF
MOV AH,N
INT 21H
ENDM
P:INOUT BUF3,9
INOUT BUF1,9
INOUT STR1,10
MOV BL,STR1+1
MOV BH,0
MOV BYTE PTR STR1+2[BX], '$ '
INOUT BUF3,9
MOV CL,STR1+1
XOR CH,CH
LEA DI,STR1+2
MOV AL, 'A '
XOR BX,BX
Q:REPNE SCASB
JE A
JMP OUT1
A:MOV BYTE PTR [DI]-1,0
MOV BX,1
CMP CX,0
JNE Q
OUT1:
CMP BX,0
JE M
INOUT STR1,9
JMP OUT2
M:INOUT BUF2,9
OUT2:
INOUT BUF3,9
INOUT BUF4,9
MOV AH,1
INT 21H
CMP AL, 'C '
JE P
MOV AH,4CH
INT 21H
CODES ENDS
END START
[解决办法]
宏应该写在程序的开头
[解决办法]
为了让大家方便的阅读和改进源代码,我给源代码加上了少许的注释。
INOUT MACRO BUF,N ;显示字符串和获取字符串,N是子功能号,BUF是缓冲区
LEA DX,BUF
MOV AH,N
INT 21H
ENDM
DATAS SEGMENT USE16
BUF1 DB 'PLEASE INPUT A STRING:$ '
BUF2 DB 'FIND FAIL$ '
BUF3 DB 0AH,0DH, '$ '
BUF4 DB 'PRESS C TO CONTINUE, PRESS ANYOTHER KEY TO BACK(C/?):$ '
STR1 DB 50
DB ?
DB 50 DUP(0)
DATAS ENDS
STACKS SEGMENT USE16 STACK
DB 200 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
P:INOUT BUF3,9 ;回车换行
INOUT BUF1,9 ;显示“PLEASE INPUT A STRING:”
INOUT STR1,10 ;从键盘读取字符串放入[STR1+2]
MOV BL,STR1+1 ;实际读取的字符数
MOV BH,0
MOV BYTE PTR STR1+2[BX], '$ '
INOUT BUF3,9 ;换行
MOV CL,STR1+1
XOR CH,CH
LEA DI,STR1+2 ;DI指向读入的字符串
MOV AL, 'A '
XOR BX,BX
Q:REPNE SCASB
JE A
JMP OUT1 ;没有找到“A“
A:MOV BYTE PTR [DI]-1,0 ;将“A”的位置上置零
MOV BX,1 ;设置找到标志
CMP CX,0
JNE Q
OUT1:
CMP BX,0
JE M
INOUT STR1+2,9 ;显示删除“A”后的字符串(如果没有找到“A”就显示原串)
JMP OUT2
M:INOUT BUF2,9 ;显示‘FIND FAIL’
OUT2:
INOUT BUF3,9 ;回车换行
INOUT BUF4,9 ;显示 'PRESS C TO CONTINUE, PRESS ANYOTHER KEY TO BACK(C/?): '
MOV AH,1
INT 21H
CMP AL, 'C '
JE P ;输入用户输入了“C”,继续……
MOV AH,4CH
INT 21H
CODES ENDS
END START