2013-04-29 77 views
6

我有两个向量;其中一个(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的内容。

有谁知道我做错了什么?

回答

0

两个明显的错误开始与

MOV EDI,5

,但第一CMP具有EDI-1,所以它开始于

====

MOV RCX,10

,但第一CMP已RCX-1,所以它开始于9

====

CMP EDI,0

JNE CHARACTER_1

MOV RCX,10

CHARACTER_1复位10在EDI循环的中间环路,是可以吗?

====

不知道是什么RCX的,我认为它的ECX被用来循环character_2

MOV RCX,10我猜就是十数字,而不是16个二进制

一旦你排序的所有格菲小细节出它会动摇,但魔鬼在这些蝇头程序的详细

=========

“如果最后VectorA的数目是9,它实际上转到found_it标签”

这是因为跳转总是在10复位RCX,然后有一个CMP RCX-1(因此RCX = 9)

如此这般10 9 10 CMP 9 CMP 10 9 CMP而不是10 CMP 9 CMP 8 CMP 7 6等

+0

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

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  

环character_2

如果没有匹配这里会发生什么?

EDI将EDI-1永远

你仍然需要找到一种方式来贬低EDI

EDI = EDI-1有点儿事

你做

月EDI

如果有匹配,但保持edi相同,如果没有匹配

+0

那是因为如果没有匹配,那么在搜索中就没有意义了。当它在VectorA中找到一个不是VectorB的一部分的单个数字时,整个VectorA变得无效,并且程序退出,通过eax返回1。 – user2333787 2013-04-30 14:49:43

1

哎呀,我想我发现了这个问题... 看起来eax寄存器并不适用于单字节内容(向量中有字符,字节大小)。我改变了线......

mov eax, [ebx+edi-1]  
cmp eax, [VectorB+rcx-1] 

...到...

mov al, [ebx+edi-1]  
cmp al, [VectorB+rcx-1] 

而现在它似乎工作。 看来eax实际上是读取4个字节的矢量而不是1.

无论如何感谢。 :)