比较装配中的向量

时间:2013-04-29 22:35:20

标签: assembly

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

有谁知道我做错了什么?

3 个答案:

答案 0 :(得分: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个。

无论如何,谢谢。 :)

答案 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    

循环character_2

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

edi将永远是edi-1

您仍然需要找到一种方法来弃用edi

edi = edi-1有点儿的东西

你做

dec edi

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