String 子字符串搜索程序总是导致false
托管所有必需的文件。我先解释一下我在这里做什么 客观的 程序应该读取两个不同长度的字符串,长度小于200,以换行符结尾。读取字符串后,搜索两个字符串中是否有一个是另一个字符串的子字符串。如果两者相同;返回true 返回值String 子字符串搜索程序总是导致false,string,assembly,x86,masm,x86-16,String,Assembly,X86,Masm,X86 16,托管所有必需的文件。我先解释一下我在这里做什么 客观的 程序应该读取两个不同长度的字符串,长度小于200,以换行符结尾。读取字符串后,搜索两个字符串中是否有一个是另一个字符串的子字符串。如果两者相同;返回true 返回值 TRUE:其中一个字符串是子字符串 FALSE:两个字符串完全不同 程序 我在我的项目中所做的是: 通过调用过程将字符串读入变量STR1和STR2。该过程返回BX中字符串的长度。我将第一个字符串的长度存储在另一个L1类型DW的变量中 比较第二个字符串的长度(现在位于BX)与
:其中一个字符串是子字符串TRUE
:两个字符串完全不同FALSE
STR1
和STR2
。该过程返回BX中字符串的长度。我将第一个字符串的长度存储在另一个L1
类型DW
的变量中BX
)与L1
- 如果两者相等,则将
设置为1CX
- 否则设置CX=abs(BX-L1)|绝对值
BX-L1
DI
设置为指向较长的字符串L1
设置为较小字符串的长度DX
设置为0。使用上面设置的CX
值启动一个循环DX
添加到DI
中,并使用CMPSB
将较短的SI
字符串与较长的DI
字符串进行比较。将CX
更新为L1
,以便REPE CMPSB
可以工作李>
DX
。重置CX
、DI
和SI
。将CX
递减1(通过使用循环
操作完成)后,从步骤4开始标题分配:读取两个字符串并。。。
.小型模型
保存\u REG宏注册表
IRP D,
推
ENDM
ENDM
加载_REG宏注册表
IRP D,
流行音乐
ENDM
ENDM
结束DOS宏
莫夫啊,76岁
INT 21H
ENDM
换行宏
保存注册
MOV啊,2
MOV-DL,0AH
INT 21H
MOV-DL,0DH
INT 21H
加载注册
ENDM
.烟囱100小时
.数据
STR1数据库200重复(65)
STR2数据库200重复(0)
提示DB“输入字符串”
NUM DB“1:$”
L1 DW 0
UNEQL DB“未找到子字符串$”
找到相等的DB“子字符串$”
.代码
主进程
MOV-AX,@DATA
MOV-DS,AX
斧头
莫夫啊,9
LEA DX,提示
INT 21H
李迪,STR1
调用READ_STR
MOV L1,BX
新线
MOV NUM,“2”
INT 21H
调用READ_STR
李斯,STR1
李迪,STR2;DI存储较长的字符串
CMP L1,BX
JE EQL
CMP L1,BX
JG投资
MOV-CX,BX
副总裁,L1
JMP比较
投资部:
MOV-CX,L1
副CX,BX
MOV L1,BX
李斯,STR2
LEA-DI,STR1;DI存储更长的字符串
新线
调用DISP_STR
JMP比较
EQL:
MOV CX,1
比较:
异或DX,DX
顶部:
保存注册
添加DI,DX
推送CX
MOV-CX,L1
重复CMPSB
JCXZ发现
有限公司
流行音乐
加载注册
环顶
未找到:
新线
LEA DX,UNEQL
莫夫啊,9
INT 21H
结束
发现:
流行音乐
加载注册
新线
LEA DX,相等
莫夫啊,9
INT 21H
结束
主端
包括READSTR.ASM
包括DISPSTR.ASM
端干管
DISPSTR.ASM
DISP\u STR PROC
保存注册
MOV-CX,BX
CLD
MOV啊,2
显示循环:
洛兹
MOV DL,AL
INT 21H
循环显示循环
加载注册
RET
DISP_STR ENDP
READSTR.ASM
READ\u STR PROC
保存注册
异或BX,BX
CLD
莫夫啊,1
INT 21H
而U循环:
CMP-AL,0DH
我结束了
CMP-AL,08H
JNE存储
十二月十日
德克迪
下一个JMP
存储:
斯托斯
公司BX
下一步:
INT 21H
JMP WHILE_循环
结束时:
加载注册
RET
读_STR ENDP
在我看来,您可以使用以下步骤:
您应该选取最短的字符串,并尝试将其第一个字母与最长字符串中的所有字母进行比较,一旦比较结果为真,则转到最短字符串中的下一个字母,并尝试将其与最长字符串中的下一个字母进行比较
不久前,我在MASM32中编写了一个单词解读器。用户在程序字典中提供一个加扰的单词,程序将其解译并显示正确的单词
就其工作方式而言,它可能对您单独处理每封信时有所帮助
这是我制作的解读器的代码:
.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/masm32.inc
include /masm32/include/kernel32.inc
includelib /masm32/lib/masm32.lib
includelib /masm32/lib/kernel32.lib
.data
not_found db "not_found",0
word0 db "souhail",0
word1 db "ability",0
word2 db"absence",0
word3 db "actions",0
word4 db "amazing",0
word5 db "believe", 0
word6 db "browser", 0
word7 db "caption", 0
word8 db "captive", 0
word9 db "ceiling", 0
word10 db "degrees", 0
word11 db "denizen", 0
word12 db "develop", 0
word13 db "examine", 0
word14 db "example", 0
word15 db "exploit", 0
word16 db "fifteen", 0
word17 db "focused", 0
word18 db "fortune", 0
word19 db "forward",0
word20 db "garbage", 0
word21 db "gasping", 0
word22 db "graphic", 0
word23 db "handgun", 0
word24 db "hastily", 0
word25 db "helpful",0
word26 db "iceberg", 0
word27 db "impeach", 0
word28 db "inspect",0
word29 db "jawbone", 0
word30 db "justify", 0
word31 db "keyword", 0
word32 db "kickoff", 0
word33 db "kneepad", 0
word34 db "lactose", 0
word35 db "latency", 0
word36 db "legible", 0
word37 db "madness", 0
word38 db "magical", 0
word39 db "manhunt", 0
word40 db "mission", 0
word41 db "nametag", 0
word42 db "nitrate", 0
word43 db "nowhere", 0
word44 db "officer", 0
word45 db "optical", 0
word46 db "outlook", 0
word47 db "oxidize", 0
word48 db "paradox", 0
word49 db "pathway", 0
word50 db "patient", 0
word51 db "payment", 0
word52 db "qualify", 0
word53 db "quality", 0
word54 db "quarrel", 0
word55 db "radical", 0
word56 db "railing", 0
word57 db "reduced", 0
word59 db "resolve", 0
word60 db "savings", 0
word61 db "sayings", 0
word62 db "scissor", 0
word63 db "shadows", 0
word64 db "tactics", 0
word65 db "teacher", 0
word66 db "terrify", 0
word67 db "tractor", 0
word68 db "unarmed", 0
word69 db "unmasks", 0
word70 db "updates", 0
word71 db "vaccine", 0
word72 db "valleys", 0
word73 db "walnuts", 0
word74 db "wealthy", 0
word75 db "whacked", 0
word76 db "willing", 0
word77 db "wizards", 0
word78 db "xysters", 0
word79 db "yielded", 0
word80 db "yoghurt", 0
word81 db "younger",0
word82 db "zippers" ,0
word83 db "zombies",0
.data?
my_words db 1024 dup(?)
printme db 1024 dup(?)
exit db 1024 dup(?)
.code
start :
First :
invoke StdIn, addr my_words, 200
lea eax, my_words
mov word ptr [eax+7],00
mov word ptr [eax+10h],00
lea edx, word1
push edx
mov esi,7 ;set target word counter
mov bl,byte ptr [eax] ; mov first letter of input to bl
compare :
mov cl, byte ptr [edx] ;mov letter of targer word to cl
cmp bl,cl
je add_one_to_my_word
inc edx
dec esi
cmp esi,0
je switch_to_next
jmp compare
add_one_to_my_word :
inc eax
mov bl,byte ptr [eax]
mov edx, dword ptr [esp]
mov esi,7
cmp bl,0
je store1
jmp compare
switch_to_next :
lea eax,my_words
mov bl, byte ptr [eax]
pop edx
add edx,8
push edx
mov esi,7
cmp byte ptr [edx], 0
je notfound
jmp compare
store1 :
pop edx
lea eax, printme
store_12 :
mov bl, byte ptr [edx]
mov byte ptr [eax], bl
inc eax
inc edx
cmp byte ptr [edx], 0
jnz store_12
;invoke StdOut, addr printme
;invoke StdIn, addr exit, 200
Second :
lea eax, my_words
add eax,9
lea edx, word1
push edx
mov esi,7 ;set target word counter
mov bl,byte ptr [eax] ; mov first letter of input to bl
compare2 :
mov cl, byte ptr [edx] ;mov letter of targer word to cl
cmp bl,cl
je add_one_to_my_word_2
inc edx
dec esi
cmp esi,0
je switch_to_next_2
jmp compare2
add_one_to_my_word_2 :
inc eax
mov bl,byte ptr [eax]
mov edx, dword ptr [esp]
mov esi,7
cmp bl,0
je store2
jmp compare2
switch_to_next_2 :
lea eax,my_words
add eax,9
mov bl, byte ptr [eax]
pop edx
add edx,8
push edx
mov esi,7
cmp byte ptr [edx], 0
je notfound
jmp compare2
store2 :
pop edx
lea eax, printme
add eax,8
store_22 :
mov bl, byte ptr [edx]
mov byte ptr [eax], bl
inc eax
inc edx
cmp byte ptr [edx], 0
jnz store_22
Third :
lea eax, my_words
add eax,12h
lea edx, word1
push edx
mov esi,7 ;set target word counter
mov bl,byte ptr [eax] ; mov first letter of input to bl
compare3 :
mov cl, byte ptr [edx] ;mov letter of targer word to cl
cmp bl,cl
je add_one_to_my_word_3
inc edx
dec esi
cmp esi,0
je switch_to_next_3
jmp compare3
add_one_to_my_word_3 :
inc eax
mov bl,byte ptr [eax]
mov edx, dword ptr [esp]
mov esi,7
cmp bl,0
je store3
jmp compare3
switch_to_next_3 :
lea eax,my_words
add eax,12h
mov bl, byte ptr [eax]
pop edx
add edx,8
push edx
mov esi,7
cmp byte ptr [edx], 0
je notfound
jmp compare3
store3 :
pop edx
lea eax, printme
add eax,11h
store_23 :
mov bl, byte ptr [edx]
mov byte ptr [eax], bl
inc eax
inc edx
cmp byte ptr [edx], 0
jnz store_23
Put_Order :
lea eax, printme
add eax,7
mov byte ptr [eax], 2Ch
add eax,8
mov word ptr [eax],202Ch
invoke StdOut, addr printme
invoke StdIn, addr exit, 200
call start
notfound :
invoke StdOut, addr not_found
invoke StdIn , addr exit,200
end start
您应该学习使用调试器,以便自己修复代码
总之,从快速浏览中可以看出,第一个明显的问题是,当您使用
READ\u STR
读取第二个字符串时,您没有将DI
设置为指向STR2
。因此,由于READ\u STR
保留DI
,第二个字符串也将被读入STR1
,覆盖第一个字符串。解决方案:将LEA DI,STR2
移动到之前。如果没有其他潜在的错误,应该可以解决。是的。这是唯一的错误。谢谢。旁注,你能把我链接到一个关于如何使用MASM版本5提供的调试的简单教程吗?
TITLE Assignment: Read two strings and ...
.MODEL SMALL
SAVE_REG MACRO REGS
IRP D, <REGS>
PUSH D
ENDM
ENDM
LOAD_REG MACRO REGS
IRP D, <REGS>
POP D
ENDM
ENDM
END_DOS MACRO
MOV AH, 76
INT 21H
ENDM
NEWLINE MACRO
SAVE_REG <AX, DX>
MOV AH, 2
MOV DL, 0AH
INT 21H
MOV DL, 0DH
INT 21H
LOAD_REG <DX, AX>
ENDM
.STACK 100H
.DATA
STR1 DB 200 DUP(65)
STR2 DB 200 DUP(0)
PROMPT DB "Enter string "
NUM DB "1: $"
L1 DW 0
UNEQL DB "No substring found$"
EQUAL DB "Substring was found$"
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
MOV AH, 9
LEA DX, PROMPT
INT 21H
LEA DI, STR1
CALL READ_STR
MOV L1, BX
NEWLINE
MOV NUM, '2'
INT 21H
CALL READ_STR
LEA SI, STR1
LEA DI, STR2 ; DI stores the longer string
CMP L1, BX
JE EQL
CMP L1, BX
JG INV
MOV CX, BX
SUB CX, L1
JMP COMPARE
INV:
MOV CX, L1
SUB CX, BX
MOV L1, BX
LEA SI, STR2
LEA DI, STR1 ; DI stores longer string
NEWLINE
CALL DISP_STR
JMP COMPARE
EQL:
MOV CX, 1
COMPARE:
XOR DX, DX
TOP:
SAVE_REG <DI, SI>
ADD DI, DX
PUSH CX
MOV CX, L1
REPE CMPSB
JCXZ FOUND
INC DX
POP CX
LOAD_REG <SI, DI>
LOOP TOP
NOT_FOUND:
NEWLINE
LEA DX, UNEQL
MOV AH, 9
INT 21H
END_DOS
FOUND:
POP CX
LOAD_REG <SI, DI>
NEWLINE
LEA DX, EQUAL
MOV AH, 9
INT 21H
END_DOS
MAIN ENDP
INCLUDE READSTR.ASM
INCLUDE DISPSTR.ASM
END MAIN
DISP_STR PROC
SAVE_REG <AX, CX, DX, SI>
MOV CX, BX
CLD
MOV AH, 2
DISP_LOOP:
LODSB
MOV DL, AL
INT 21H
LOOP DISP_LOOP
LOAD_REG <SI, DX, CX, AX>
RET
DISP_STR ENDP
READ_STR PROC
SAVE_REG <AX, DI>
XOR BX, BX
CLD
MOV AH, 1
INT 21H
WHILE_LOOP:
CMP AL, 0DH
JE END_WHILE
CMP AL, 08H
JNE STORAGE
DEC BX
DEC DI
JMP NEXT
STORAGE:
STOSB
INC BX
NEXT:
INT 21H
JMP WHILE_LOOP
END_WHILE:
LOAD_REG <DI, AX>
RET
READ_STR ENDP
.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/masm32.inc
include /masm32/include/kernel32.inc
includelib /masm32/lib/masm32.lib
includelib /masm32/lib/kernel32.lib
.data
not_found db "not_found",0
word0 db "souhail",0
word1 db "ability",0
word2 db"absence",0
word3 db "actions",0
word4 db "amazing",0
word5 db "believe", 0
word6 db "browser", 0
word7 db "caption", 0
word8 db "captive", 0
word9 db "ceiling", 0
word10 db "degrees", 0
word11 db "denizen", 0
word12 db "develop", 0
word13 db "examine", 0
word14 db "example", 0
word15 db "exploit", 0
word16 db "fifteen", 0
word17 db "focused", 0
word18 db "fortune", 0
word19 db "forward",0
word20 db "garbage", 0
word21 db "gasping", 0
word22 db "graphic", 0
word23 db "handgun", 0
word24 db "hastily", 0
word25 db "helpful",0
word26 db "iceberg", 0
word27 db "impeach", 0
word28 db "inspect",0
word29 db "jawbone", 0
word30 db "justify", 0
word31 db "keyword", 0
word32 db "kickoff", 0
word33 db "kneepad", 0
word34 db "lactose", 0
word35 db "latency", 0
word36 db "legible", 0
word37 db "madness", 0
word38 db "magical", 0
word39 db "manhunt", 0
word40 db "mission", 0
word41 db "nametag", 0
word42 db "nitrate", 0
word43 db "nowhere", 0
word44 db "officer", 0
word45 db "optical", 0
word46 db "outlook", 0
word47 db "oxidize", 0
word48 db "paradox", 0
word49 db "pathway", 0
word50 db "patient", 0
word51 db "payment", 0
word52 db "qualify", 0
word53 db "quality", 0
word54 db "quarrel", 0
word55 db "radical", 0
word56 db "railing", 0
word57 db "reduced", 0
word59 db "resolve", 0
word60 db "savings", 0
word61 db "sayings", 0
word62 db "scissor", 0
word63 db "shadows", 0
word64 db "tactics", 0
word65 db "teacher", 0
word66 db "terrify", 0
word67 db "tractor", 0
word68 db "unarmed", 0
word69 db "unmasks", 0
word70 db "updates", 0
word71 db "vaccine", 0
word72 db "valleys", 0
word73 db "walnuts", 0
word74 db "wealthy", 0
word75 db "whacked", 0
word76 db "willing", 0
word77 db "wizards", 0
word78 db "xysters", 0
word79 db "yielded", 0
word80 db "yoghurt", 0
word81 db "younger",0
word82 db "zippers" ,0
word83 db "zombies",0
.data?
my_words db 1024 dup(?)
printme db 1024 dup(?)
exit db 1024 dup(?)
.code
start :
First :
invoke StdIn, addr my_words, 200
lea eax, my_words
mov word ptr [eax+7],00
mov word ptr [eax+10h],00
lea edx, word1
push edx
mov esi,7 ;set target word counter
mov bl,byte ptr [eax] ; mov first letter of input to bl
compare :
mov cl, byte ptr [edx] ;mov letter of targer word to cl
cmp bl,cl
je add_one_to_my_word
inc edx
dec esi
cmp esi,0
je switch_to_next
jmp compare
add_one_to_my_word :
inc eax
mov bl,byte ptr [eax]
mov edx, dword ptr [esp]
mov esi,7
cmp bl,0
je store1
jmp compare
switch_to_next :
lea eax,my_words
mov bl, byte ptr [eax]
pop edx
add edx,8
push edx
mov esi,7
cmp byte ptr [edx], 0
je notfound
jmp compare
store1 :
pop edx
lea eax, printme
store_12 :
mov bl, byte ptr [edx]
mov byte ptr [eax], bl
inc eax
inc edx
cmp byte ptr [edx], 0
jnz store_12
;invoke StdOut, addr printme
;invoke StdIn, addr exit, 200
Second :
lea eax, my_words
add eax,9
lea edx, word1
push edx
mov esi,7 ;set target word counter
mov bl,byte ptr [eax] ; mov first letter of input to bl
compare2 :
mov cl, byte ptr [edx] ;mov letter of targer word to cl
cmp bl,cl
je add_one_to_my_word_2
inc edx
dec esi
cmp esi,0
je switch_to_next_2
jmp compare2
add_one_to_my_word_2 :
inc eax
mov bl,byte ptr [eax]
mov edx, dword ptr [esp]
mov esi,7
cmp bl,0
je store2
jmp compare2
switch_to_next_2 :
lea eax,my_words
add eax,9
mov bl, byte ptr [eax]
pop edx
add edx,8
push edx
mov esi,7
cmp byte ptr [edx], 0
je notfound
jmp compare2
store2 :
pop edx
lea eax, printme
add eax,8
store_22 :
mov bl, byte ptr [edx]
mov byte ptr [eax], bl
inc eax
inc edx
cmp byte ptr [edx], 0
jnz store_22
Third :
lea eax, my_words
add eax,12h
lea edx, word1
push edx
mov esi,7 ;set target word counter
mov bl,byte ptr [eax] ; mov first letter of input to bl
compare3 :
mov cl, byte ptr [edx] ;mov letter of targer word to cl
cmp bl,cl
je add_one_to_my_word_3
inc edx
dec esi
cmp esi,0
je switch_to_next_3
jmp compare3
add_one_to_my_word_3 :
inc eax
mov bl,byte ptr [eax]
mov edx, dword ptr [esp]
mov esi,7
cmp bl,0
je store3
jmp compare3
switch_to_next_3 :
lea eax,my_words
add eax,12h
mov bl, byte ptr [eax]
pop edx
add edx,8
push edx
mov esi,7
cmp byte ptr [edx], 0
je notfound
jmp compare3
store3 :
pop edx
lea eax, printme
add eax,11h
store_23 :
mov bl, byte ptr [edx]
mov byte ptr [eax], bl
inc eax
inc edx
cmp byte ptr [edx], 0
jnz store_23
Put_Order :
lea eax, printme
add eax,7
mov byte ptr [eax], 2Ch
add eax,8
mov word ptr [eax],202Ch
invoke StdOut, addr printme
invoke StdIn, addr exit, 200
call start
notfound :
invoke StdOut, addr not_found
invoke StdIn , addr exit,200
end start