我有两个向量; 其中一个(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与下一行的内容不对应.
有谁知道我做错了什么?
首先有两个明显的错误
移动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 等