我有一个项目,使文字狩猎游戏在汇编8088/8086。我做的一切,唯一剩下的事情是比较的话,用户输入的关键字保持在一个变量。现在我使用字符串指令CMPSB(因为我输入和关键字字典都是以字节为单位)为了进行比较,现在在这种情况下,正确地比较了大部分单词,但是由于某种原因,一些单词没有被正确地识别。
[org 0x0100]
jmp start
str1: db "foe","grim","toll","true","fur"
find: db "grim"
comp: ;comparison function
push bp
mov bp,sp
pusha
mov cx,18 ;str1 length
lds si,[bp + 4]
les di,[bp + 8]
repne cmpsb ;compares cx times or until bytes are not equal
popa
pop bp
ret
start: ;main
push ds
push str1
push ds
push find
call comp
mov ax,0x4c00
int 21h
在这个特定示例中,这是我维护的5个字典之一,现在,当我在AFD调试器上运行它时,除了true和grim之外的所有单词都被猜到了,并且它没有将cx寄存器减少到0,这意味着它已经找到了两个字节相等的示例,但是在grim和fur的情况下,REP使用了CX的所有值。如果我把单词grim like的位置从第二个单词改为第一个单词,那么它被正确识别,但其他单词的识别会受到影响。这是一个词典的例子。所有其他4个词典都是相同的模式。大多数单词被正确识别。它们不被视为相同。
1条答案
按热度按时间a2mppw5e1#
对于“foe”、“toll”和“fur”,在当前代码中
repne cmpsb
(RepeatWhileNotEqual)将在箭头所指的位置停止,但这并不能告诉您整个单词是否都在列表中!只是至少有一个匹配字符。要完整地查找这些单词中的任何一个,您应该使用
repe cmpsb
(RepeatWhileEqual),并且CX等于 find 的长度。您需要对 * str 1 * 中任何CX大小的部分重复搜索。第1x 1 m2n1x个进程
第2x 1 m3n1x进程
第3x 1 m4n1x进程
第4x 1 m5n1x工序
宾果!