首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

60行的小程序改错,该如何处理

2012-02-25 
60行的小程序改错要求是在str1串中寻找字符‘A’,若找到则删除,若找不到,则显示findfail,用串操作完成,并能

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

热点排行