有关字符串比较的问题
时间:2011-06-03
来源:互联网
DATA SEGMENT STR1 DB 10,13,'match','$' STR2 DB 10,13,'No match','$' STR3 DB 10,13,'please input the first string:','$' STR4 DB 10,13,'please input the second string:','$' STR1_IN DB 10,13,10 DUP(?) STR2_IN DB 10,13,10 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX ;加上这句,因为串比较时用到它 MOV DX,OFFSET STR3 MOV AH,09H INT 21H MOV DX,OFFSET STR1_IN MOV AH,0AH INT 21H MOV DX,OFFSET STR4 MOV AH,09H INT 21H MOV DX,OFFSET STR2_IN MOV AH,0AH INT 21H MOV CX,3 LEA SI,STR1_IN LEA DI,STR2_IN CLD REPZ CMPSB JZ L2 JNZ L1 L1: MOV DX,OFFSET STR2 MOV AH,09H INT 21H JMP _END ;加上这句,否则两种提示有可能都出现 L2: MOV DX,OFFSET STR1 MOV AH,09H INT 21H _END: MOV AH,4CH INT 21H CODE ENDS END START
为什么运行时,当输入诸如abc,ac或者11,12这样的数据时,也会判断为相同呢?
还有2个问题,程序中MOV CX,3是起什么作用的啊?为什么我将3改成其他数字,判断结果又会发生变化
还有如果我想让这个程序不退出,判断一组后继续判断,JMP START的代码应该加在哪里?
刚接触汇编,问题比较多,希望大家帮帮忙
作者: ryusonfrex 发布时间: 2011-06-03
第二个问题,“mov cx,3”是设置循环指令“repz”的循环次数的,即限制最长的串比较长度,如果你的输入超出了这个长度限制,则超出的部分不会进行串比较操作,即当cx设置为3时,输入“abcd”和“abcc”将被认为是相同的两个串。
第三个问题,如果想不停的循环执行多组串比较操作,则只需在“_END:”后加入语句“JMP START”即可
不知道是否解决了你的问题
作者: huyi0125 发布时间: 2011-06-03
不过第一个问题,我在代码中加入add si,2和add di,2后会提示以下错误
Undefined symbol:SI,2
Argument needs type override
作者: ryusonfrex 发布时间: 2011-06-03
作者: leetow2003 发布时间: 2011-06-03
DATA SEGMENT STR1 DB 10,13,'match','$' STR2 DB 10,13,'No match','$' STR3 DB 10,13,'please input the first string:','$' STR4 DB 10,13,'please input the second string:','$' STR1_IN DB 10,13,10 DUP(?) STR2_IN DB 10,13,10 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX ;加上这句,因为串比较时用到它 MOV DX,OFFSET STR3 MOV AH,09H INT 21H MOV DX,OFFSET STR1_IN MOV AH,0AH INT 21H MOV DX,OFFSET STR4 MOV AH,09H INT 21H MOV DX,OFFSET STR2_IN MOV AH,0AH INT 21H LEA SI,STR1_IN LEA DI,STR2_IN ADD SI,2 ADD DI,2 CLD MOV CX,25 REPZ CMPSB JZ L2 JNZ L1 L1: MOV DX,OFFSET STR2 MOV AH,09H INT 21H JMP _END ;加上这句,否则两种提示有可能都出现 L2: MOV DX,OFFSET STR1 MOV AH,09H INT 21H _END: JMP START MOV AH,4CH INT 21H CODE ENDS END START
修改以后的代码。。。。不知道为什么,不管输入字符是否相同,全部判断为不相同了
作者: ryusonfrex 发布时间: 2011-06-03
为什么我把25改成10之后,6组数据后,判断结果就开始出现异常了
而25的时候,所有判断结果均为不同
作者: ryusonfrex 发布时间: 2011-06-03
很奇怪的输出结果。。。费解啊
作者: ryusonfrex 发布时间: 2011-06-03
STR1_IN DB 10,13,10 DUP(?)
STR2_IN DB 10,13,10 DUP(?)
所以mov cx,10
这句代码放置位置应该在REPZ CMPSB之前;
你应该想办法在把字符串存在STR1_IN和STR2_IN之前,把它们清0
作者: leetow2003 发布时间: 2011-06-03
同样的代码,这回又是4次后,判断结果出现异常,搞不懂了。。。。。。。
作者: ryusonfrex 发布时间: 2011-06-03
作者: leetow2003 发布时间: 2011-06-03
这是我的结果:
Microsoft Windows [???? 6.1.7600]
???????? (c) 2009 Microsoft Corporation????????????????
C:\Users\Administrator>cd ..\..\MASM
C:\MASM>test.exe
please input the first string:1
please input the second string:1
match
please input the first string:ab
please input the second string:ab
match
please input the first string:abc
please input the second string:abc
match
please input the first string:aa
please input the second string:ab
No match
please input the first string:abc
please input the second string:ab
No match
please input the first string:a
please input the second string:ab
No match
please input the first string:abcd
please input the second string:abcd
match
please input the first string:abcd
please input the second string:abcc
No match
please input the first string:
我修改后的源代码如下:
DATA SEGMENT
STR1 DB 10,13,'match','$'
STR2 DB 10,13,'No match','$'
STR3 DB 10,13,'please input the first string:','$'
STR4 DB 10,13,'please input the second string:','$'
STR1_IN DB 10,13,10 DUP(?)
STR2_IN DB 10,13,10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX ;加上这句,因为串比较时用到它
MOV DX,OFFSET STR3
MOV AH,09H
INT 21H
MOV DX,OFFSET STR1_IN
MOV AH,0AH
INT 21H
MOV DX,OFFSET STR4
MOV AH,09H
INT 21H
MOV DX,OFFSET STR2_IN
MOV AH,0AH
INT 21H
MOV CX,4;///////////////////////////////////我把cx修改为4,但这不影响程序的流程,只是让限制长度变为4字节
LEA SI,STR1_IN
add si, 2;//////////////////////////////si+2,跳过“10,13”
LEA DI,STR2_IN
add di, 2;//////////////////////////////di+2,跳过“10,13”
CLD
REPZ CMPSB
JZ L2
JNZ L1
L1: MOV DX,OFFSET STR2
MOV AH,09H
INT 21H
JMP _END ;加上这句,否则两种提示有可能都出现
L2: MOV DX,OFFSET STR1
MOV AH,09H
INT 21H
_END:
jmp START;//////////////////////////////////实现不停的循环比较
MOV AH,4CH
INT 21H
CODE ENDS
END START
作者: huyi0125 发布时间: 2011-06-03
STR1_IN和STR2_IN清0
9楼说得很对,需要将原来存储的数据清0
作者: huyi0125 发布时间: 2011-06-03
STR1_IN和STR2_IN清0
刚接触汇编,不是太清楚,只知道寄存器清零方法,如何将这2个变量清零?
STR1_IN DB 10,13,10 DUP(0)
STR2_IN DB 10,13,10 DUP(0)
这样试了貌似也不行。。。。
作者: ryusonfrex 发布时间: 2011-06-03
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28