编写完整程序,从键盘输入一个字符串 STRING,同时,把字符串 STRING
中的‘&’字符用空格符替代。并显示出替代后字符串及被替代字符的位置。
利用串扫描指令编制该功能程序,注意一,查找到“&”符号的位置存
在 STR_POS 位置;注意二,显示位置时要转换成 ASCII 码输出。
以下是我的代码,刚学汇编还不太熟悉语法,制作的程序出现问题,搞了一晚上也没搞好
程序运行还没有输入,直接就进入了死循环,一直输出0和乱码,求指点
DATA segment
STRING db 200 dup(?)
STR_LENGTH db 0
STR_POS db 200 dup(?) ;被替代字符的位置
DATA ends
CODE segment
ASSUME CS:CODE, DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,0AH
LEA DX,STRING
INT 21H
MOV AL,[STRING+1] ;第二个字节存储字符数
MOV STR_LENGTH,AL
MOV AL,'&'
LEA DI,[STRING+2]
MOV CL,STR_LENGTH
MOV CH,0
LEA BX,STR_POS
MOV [BX],0 ;第一个位置保存STR_POS的元素数
INC BX
CLD
PROCESS:
REPNE SCASB
JZ SWAP ;找到'&'
JNZ OK ;没有找到,结束程序
SWAP:
DEC DI
MOV BYTE PTR [DI],' '
MOV DL,[STR_POS]
INC DL
MOV [STR_POS],DL ;STR_POS元素数+1
JMP POSITION
POSITION:
PUSH AX
MOV AX,DI
SUB AX, OFFSET STRING+2
MOV [BX],AL ;保存位置信息
INC BX
POP AX
MOV CL, STR_LENGTH ; 重置CL,准备下一轮搜索
SUB CL, AL
INC DI
JMP PROCESS ; 继续查找
OK:
LEA DX,[STRING+2]
MOV AH, 09h
INT 21h
MOV DL, 13 ; 新行
MOV AH, 02h
INT 21h
MOV DL, 10 ; 回车
MOV AH, 02h
INT 21h
LEA BX,STR_POS
MOV CL,[BX] ;STR_POS第一个位置保存元素数
MOV CH,0
INC BX
S:
MOV AH,02h
MOV DL,[BX]
ADD DL,'0' ;转化为ASCII码
INT 21h ;打印被替代字符的位置
INC BX
MOV AH,02H
MOV DL,' '
INT 21h
LOOP S
mov AX, 4Ch
int 21h
CODE ends
end START
