答案仅供参考,大家还是自己写比较好。
(汇编语言实现)用字符串处理指令编制程序,处理字符串的比较和查找,显示结果。
要求:
(1)字符串的比较函数中,一个字符串在数据段定义,另一个字符串在程序执行时从键盘输入,必须定义键盘缓冲区。指出不相等的位置。
(2)在字符串中查找某个字符,并指出找到的位置。
第一问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
DATA SEGMENT BUFF DB 255 DUP('?');定义一个缓冲区,缓冲区长度比需要比较的字符串长即可,缓冲区的?需要加单引号 DATA ENDS EXT SEGMENT MESS DB 'www.omegaxyz.com$';注意最后一定要加$ EXT ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXT START: MOV AX,DATA MOV DS,AX MOV AX,EXT MOV ES,AX ;套路 LEA DX,BUFF MOV AH,0AH INT 21H ;使用Dos 0AH命令向缓冲区输入字符串 MOV CL,BUFF+1 ;注意Dos 0AH命令实际输入的字符数量保存在内存DX+1中(见附录),即BUFF+1,因此把BUFF+1的值给CL LEA SI,BUFF+2 ;需要使用CMPSB命令,从BUFF+2开始是真正输入的值赋值给SI LEA DI,MESS ;被比较的原始串 CLD MOV BL,'0' ;为了显示串开始不同的地方,设置BL的初始值,由于显示的是ascii码所代表的值,因此把‘0’赋值给BL XY:INC BL CMPSB LOOPZ XY ;循环一次BL+1 JZ YES MOV DL,BL JMP xxxxxxxxxx YES:MOV DL,'Y' xxxxxxxxxx:MOV AH,2 INT 21H ;显示 MOV AH,4CH INT 21H CODE ENDS END START |
测试:
代码中字符串为www.omegaxyz.com
测试为:
结果:
说明第七个字符e变为i了
下面输入正确的则显示Y
第二问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
EXT SEGMENT MESS DB 'www.omegaxyz.com$' EXT ENDS ;注意要使用SCASB命令必须将数据保存在ES中 CODE SEGMENT ASSUME CS:CODE,ES:EXT START: MOV AX,EXT MOV ES,AX MOV AH,01H INT 21H ;调用Dos 01H命令,从键盘中输入1个字符并保存在AL中 MOV CX,17 LEA DI,MESS CLD MOV BL,'0' ;为了寻找所求字符位置,设置一个寄存器用来保存 XY:INC BL SCASB LOOPNZ XY ;LOOPNZ CX不等于0,ZF=0即不相等时循环 JZ YES MOV DL,'N' ;N说明没有查找到 JMP DISP YES:MOV DL,BL DISP:MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START |
测试字符串:www.omegaxyz.com
o为第5个字符
u不在字符串中,显示E(ERROR)。
造福大家