比较装配中的向量

use*_*787 6 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:
Run Code Online (Sandbox Code Playgroud)

首先,我知道我可能不应该将其用作EAX索引,但在尝试使用其他一些注册表EAX之后,唯一一个不会让人感到YASM惊慌失措.

问题是......它似乎不起作用.第一个验证循环工作正常.如果VectorA的最后一个数字是9,它实际上转到found_it标签并执行它必须做的事情.但是,无论第二个数字是什么,它都不会在VectorB上找到它.

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

有谁知道我做错了什么?

ady*_*ady 0

首先有两个明显的错误

移动edi,5

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

====

移动接收,10

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

====

CMP 编辑,0

jne 字符_1

移动接收,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 等