我有两个向量;其中一个(VectorA)由用户引入,另一个(VectorB)包含一串单个数字。它们都是char向量。这个想法是,程序必须逐个比较VectorA的数量,以确保它们是有效的数字,将它们与VectorB中的数据进行比较,其中包含所有可用的有效数字。比较汇编中的向量
如果VectorA中的所有数字都包含在VectorB中,则程序返回0.如果VectorA中任何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
吓坏了的人。
问题是......它似乎没有工作。第一个验证循环正常工作。如果VectorA的最后一个数字是9,那么它实际上会转到found_it
标签并做它必须做的事情。但是,无论第二个数字是什么,它都不会在VectorB上找到它。
为了进行调试,我在主要CMP
行的上方添加了一条mov esi, [VectorB+rcx-1]
行,在这两行比较两个值。我发现他们第一次进行比较时,ESI
具有正确的值。但是,程序第二次经历该指令时,ESI
返回一个14648值,这当然不对应于下一行中的EAX
的内容。
有谁知道我做错了什么?
rcx和edi在cmp行中有-1,因为它们需要经过各自向量的位置0-9和0-4,而不是1-10和1-5。 这应该是工作的方式:Edi正在搜索Vector1中的所有数字。对于每一个,rcx都会经过Vector2并开始比较这些数字。当他们发现巧合时,edi减少到Vector1中的下一个数字,rcx被重置为10,因此它可以再次开始比较。如果单个rcx循环没有跳转到found_it标记,那么意味着edi中的勇气不在Vector2中,因此整个事情都停止了。 – user2333787 2013-04-30 03:09:34