一 代码实现
DATAS SEGMENT ;数据段
STRING0 DB 10
DB ?
DB 10 DUP(?)
STRING1 DB 'Input the string:',0DH,0AH,'$' ;提示语
STRING2 DB 'Insert or delete?(I/D)',0DH,0AH,'$'
STRING3 DB 'Position:$'
WORD1 DW ? ;存入所改动位置
STRING4 DB 'Word:$'
WORD2 DB ? ;存入插入的字符
STRING5 DB 0DH,0AH,'$'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS ;定义DS:DX
MOV DS,AX ;DS指向缓冲区首地址基地址
hshLOOP:
LEA DX,STRING1 ;把STRING1的地址传给DX
MOV AH,9 ;DOS9号功能调用,显示提示语
INT 21H
LEA DX,STRING0 ;把STRING0的地址传给DX
MOV AH,10 ;DOS10号功能调用,键盘输入到缓冲区
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
NEXT3:
LEA DX,STRING2 ;把STRING2的地址传给DX
MOV AH,9 ;DOS9号功能调用,显示提示语
INT 21H
MOV AH,1 ;DOS1号功能调用,键盘输入并回显
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
CMP AL,'I' ;将输入的字符的ASCII码与I的ASCII码比较
JZ NEXT1 ;等于则跳转到NEXT1
CMP AL,'i' ;不等于,将输入的字符的ASCII码与i的ASCII码比较
JZ NEXT1 ;等于则跳转到NEXT1
CMP AL,'D' ;不等于,将输入的字符的ASCII码与D的ASCII码比较
JZ NEXT2 ;等于则跳转到NEXT2
CMP AL,'d' ;不等于,将输入的字符的ASCII码与d的ASCII码比较
JZ NEXT2 ;等于则跳转到NEXT2
JMP NEXT3 ;都不是上面的字符,则跳转到NEXT3
NEXT2:
CALL DEL ;执行删除
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
JMP hshLOOP ;JMP FINISH
NEXT1:
CALL INSERT ;执行插入
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
JMP hshLOOP
FINISH:
MOV AH, 4CH ;返回DOS
INT 21H
;插入子程序****************
INSERT PROC
I3: LEA DX,STRING3 ;把STRING3的地址传给DX
MOV AH,9 ;DOS9号功能调用,显示提示语插入的位置
INT 21H
MOV AH,1 ;DOS1号功能调用,键盘输入并回显
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
SUB AL,48 ;将键入的字符对应的ASCII码减去48,对应显示该字符的ASCII码
DEC AL ;al自减1
CMP AL,STRING0[1] ;Al与STRING0[1]比较
JA I3 ;al大于STRING0[1]则跳转到I3即开始,不能插入大于字符串长度后一位的位置
MOV AH,0 ;小于,将AH清0
INC AL ;AL自增1,恢复原来的位置
MOV WORD1,AX ;将AX的内容传给WORD1
LEA DX,STRING4 ;把STRING4的地址传给DX
MOV AH,9 ;DOS9号功能调用,显示提示语插入的内容
INT 21H
MOV AH,1 ;DOS1号功能调用,键盘输入并回显
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
MOV AH,0 ;AH清0
MOV WORD2,AL ;将AL输入的内容传给WORD2
MOV SI,1 ;将1赋给SI
MOV CL,STRING0[1] ;将STRING0[1]即长度传给CL
DEC SI ;Sl自减1,指向前一位元素
I1: INC SI ;SI自增1
CMP WORD1,SI ;WORD1与SI比较,确定插入的位置
JNZ I2 ;不等于,则跳转到I2
MOV DL,WORD2 ;指定位置插入指定字符
MOV AH,2 ;DOS2号功能调用,显示输出WORD2的内容
INT 21H
I2: MOV DL,STRING0[SI+1] ;将下一位地址STRING0[SI+1]传给DL
MOV AH,2 ;DOS2号功能调用显示输出STRING0[SI+1]对应内容
INT 21H
LOOP I1 ;循环I1
MOV AX,WORD1 ;将WORD1的内容传给AX
DEC AL ;AL自减1
CMP AL,STRING0[1] ;STRING0[1]的内容与AL比较
JNZ I4 ;不等于则跳转到I4
MOV DL,WORD2 ;指定位置插入指定字符
MOV AH,2 ;DOS2号功能调用,显示输出WORD2的内容
INT 21H
I4: RET ;返回主程序
INSERT ENDP
;删除子程序*****************
DEL PROC
D3: LEA DX,STRING3 ;把STRING3的地址传给DX
MOV AH,9 ;DOS9号功能调用,显示提示语删除的位置
INT 21H
MOV AH,1 ;DOS1号功能调用,键盘输入并回显
INT 21H
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;DOS9号功能调用回车换行
INT 21H
SUB AL,48 ;将键入的字符对应的ASCII码减去48,对应显示该字符的ASCII码
CMP AL,STRING0[1] ;Al与STRING0[1]比较
JA D3 ;大于则跳转到D3
MOV AH,0 ;小于,AH清0
MOV WORD1,AX ;把键入的删除位置传给WORD1
MOV SI,1 ;将1赋给SI
MOV CL,STRING0[1] ;将字符串长度传给CL
DEC SI ;SI自减1
D1: INC SI ;SI自增1
CMP WORD1,SI ;WORD1即插入位置与SI比较
;跳过输出指定位置的字符
JZ D2 ;相等则跳转到D2
MOV DL,STRING0[SI+1] ;不等于,把STRING0[SI+1]传给DX
MOV AH,2 ;DOS2号功能调用,显示输出
INT 21H
D2: LOOP D1 ;循环D1
RET ;返回主程序
DEL ENDP
CODES ENDS
END START
该程序的功能是对输入的字符串进行处理,I是对输入的字符串进行插入,输入插入的字符及插入的位置,即可进行插入功能,D是对输入的字符串进行删除,输入删除的位置即可进行删除功能。
二 运行结果
I:插入功能,运行截图如下
选择插入功能I,对输入的字符串abc进行插入,输入插入字符的位置2及插入的字符D,插入结果为aDbc,与实际相符,插入功能正确。
D:删除功能,运行截图如下
选择删除功能D,对输入的字符串abcd进行插入,输入删除字符的位置2,删除结果为acd,与实际相符,删除功能正确。