assembly cmps字符串指令汇编语言8086

bttbmeg0  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(184)

我有一个项目,使文字狩猎游戏在汇编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个词典都是相同的模式。大多数单词被正确识别。它们不被视为相同。

a2mppw5e

a2mppw5e1#

对于“foe”、“toll”和“fur”,在当前代码中repne cmpsb(RepeatWhileNotEqual)将在箭头所指的位置停止,但这并不能告诉您整个单词是否都在列表中!只是至少有一个匹配字符。

foegrimtolltruefur
foe
^

foegrimtolltruefur
toll
 ^

foegrimtolltruefur
fur
^

要完整地查找这些单词中的任何一个,您应该使用repe cmpsb(RepeatWhileEqual),并且CX等于 find 的长度。您需要对 * str 1 * 中任何CX大小的部分重复搜索。

str1: db "foe","grim","toll","true","fur"
find: db "grim"

comp:
  push bp
  mov  bp, sp
  pusha
  mov  dx, (18 - 4) + 1   ; Possible finds
next:
  mov  cx, 4
  lds  si, [bp + 4]       ; *find (constant)
  les  di, [bp + 8]       ; *str1 (varying)
  repe cmpsb
  je   found
  inc  word [bp + 8]
  dec  dx
  jnz  next
notFound:
  ...
Found:
  ...

第1x 1 m2n1x个进程

ES:DI = foeg
DS:SI = grim

第2x 1 m3n1x进程

ES:DI = oegr
DS:SI = grim

第3x 1 m4n1x进程

ES:DI = egri
DS:SI = grim

第4x 1 m5n1x工序

ES:DI = grim
DS:SI = grim

宾果!

相关问题