我有两个向量;其中一个(VectorA)由用户引入,另一个(VectorB)包含一堆单个数字。它们都是char矢量。这个想法是程序必须逐个比较VectorA的数量,以确保它们是有效数字,方法是将它们与VectorB中的数字进行比较,VectorB包含所有可用的有效数字。
如果VectorA中的所有数字都包含在VectorB中,则程序返回0.如果VectorB中没有任何VectorA数,则程序返回1。返回寄存器为EAX
。
这是代码,我希望它不会太乱,但请耐心等待(如果我使用错误的术语,请原谅,因为英语不是我的母语)...
MOV edi, 5 ;VectorA is a 5 digit vector.
character_1:
mov rcx, 10 ;VectorB is a 10 digit vector.
character_2:
mov eax, [ebx+edi-1] ;ebx contains the address of VectorA
cmp eax, [VectorB+rcx-1]
je found_it
loop character_2
mov eax, 1
jmp end_comp
found_it:
dec edi
cmp edi, 0
jne character_1
mov eax, 0
end_comp:
首先,我知道我可能不应该使用EAX
作为索引,但在尝试使用其他一些注册表之后EAX
是唯一没有使用YASM
的注册表found_it
1}}吓坏了。
问题是......它似乎不起作用。第一个验证循环工作正常。如果VectorA的最后一个数字是9,它实际上转到mov esi, [VectorB+rcx-1]
标记并执行它必须做的事情。但是,无论第二个数字是什么,它都不会在VectorB上找到它。
出于调试目的,我在主CMP
行的正上方添加了ESI
行,其中比较了两个值。我发现第一次比较时,ESI
具有正确的值。但是,程序第二次执行该指令时,EAX
返回一个14648值,这当然与下一行中{{1}}的内容不对应。
有谁知道我做错了什么?
答案 0 :(得分:1)
mov eax, [ebx+edi-1]
cmp eax, [VectorB+rcx-1]
...到...
mov al, [ebx+edi-1]
cmp al, [VectorB+rcx-1]
现在似乎有效。 看来eax实际上是读取了4个字节的向量而不是1个。
无论如何,谢谢。 :)
答案 1 :(得分:0)
以
开头的两个明显错误mov edi,5
然而第一个cmp有edi-1,所以它从4开始
====
mov rcx,10
然而第一个cmp有rcx-1,所以它从9开始
====
cmp edi,0
jne character_1
mov rcx,10
character_1在edi循环中间将循环重置为10,那可以吗?
====
不知道rcx是什么,我假设它的ecx用于循环character_2
mov rcx,10我认为是10位数字,而不是16位二进制
一旦你对所有重要的细节进行排序,它就会摇滚,但是魔鬼在这些细节中处于细节之中
======
“如果VectorA的最后一个数字是9,它实际上转到found_it标签”
这是因为跳转总是将rcx重置为10,然后有一个cmp rcx-1(所以rcx = 9)
所以它是10 9 cmp 10 9 cmp 10 9 cmp而不是10 cmp 9 cmp 8 cmp 7 6等
答案 2 :(得分:0)
CHARACTER_1:
mov rcx,10; VectorB是一个10位数的向量。
character_2:
mov eax, [ebx+edi-1] ;ebx contains the address of VectorA
cmp eax, [VectorB+rcx-1]
je found_it
如果没有匹配,这里会发生什么?
edi将永远是edi-1
您仍然需要找到一种方法来弃用edi
edi = edi-1有点儿的东西
你做
dec edi
如果匹配,但如果没有匹配则保持edi相同