6

我有两个向量;其中一个(VectorA)是用户介绍的,另一个(VectorB)包含一堆个位数的数字。它们都是 char 向量。这个想法是程序必须逐一比较 VectorA 的数字,以确保它们是有效数字,通过将它们与 VectorB 中的数字进行比较,其中包含所有可用的有效数字。

如果 VectorA 中的所有数字都包含在 VectorB 中,则程序返回 0。如果 VectorA 中的任何数字都不存在于 VectorB 中,则程序返回 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 上找到它。

出于调试目的,我mov esi, [VectorB+rcx-1]在主行正上方添加了一行CMP,用于比较两个值。我发现第一次比较它们时,ESI具有正确的值。但是,程序第二次执行该指令时,返回一个 14648 值,这当然与下一行中ESI的内容不对应。EAX

有谁知道我做错了什么?

4

3 回答 3

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 个字节。

不管怎么说,多谢拉。:)

于 2013-04-30T15:02:07.070 回答
0

两个明显的错误开始

mov edi,5

然而第一个 cmp 有 edi-1,所以它从 4 开始

====

mov rcx,10

然而第一个 cmp 有 rcx-1,所以它从 9 开始

====

cmp 编辑,0

jne character_1

mov rcx,10

character_1 在 edi 循环中间将循环重置为 10,可以吗?

====

不知道 rcx 是什么,我假设它的 ecx 被用来循环 character_2

mov rcx, 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 等

于 2013-04-30T02:40:11.803 回答
0

字符_1:

mov rcx, 10 ;VectorB 是一个 10 位的向量。

字符_2:

mov eax, [ebx+edi-1]       ;ebx contains the address of VectorA    

cmp eax, [VectorB+rcx-1]    

je found_it    

循环字符_2

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

edi 将永远是 edi-1

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

edi=edi-1 有点像

你做

dec edi

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

于 2013-04-30T09:48:23.020 回答