我有两个向量;其中一个(VectorA)由用户介绍,另一个(VectorB)包含一串单个数字。它们都是char向量。想法是程序必须将VectorA的数字与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
崩溃的注册表。问题是...它似乎不起作用。第一个验证循环工作正常。如果VectorA的最后一个数字为9,则实际上进入
found_it
标记并执行其操作。但是,无论第二个数字是什么,它都不会在VectorB上找到它。出于调试目的,我在
mov esi, [VectorB+rcx-1]
主行的正上方添加了一个CMP
行,将这两个值进行比较。我发现第一次比较时,ESI
具有正确的值。但是,程序第二次执行该指令时,ESI
返回一个14648的值,该值当然与下一行中EAX
的内容不对应。有人知道我在做什么错吗?
最佳答案
哎呀,我想我找到了问题...
看来eax寄存器并不适合单字节内容(向量中包含字符,这些字符为字节大小)。我换了线...
mov eax, [ebx+edi-1]
cmp eax, [VectorB+rcx-1]
...至...
mov al, [ebx+edi-1]
cmp al, [VectorB+rcx-1]
现在,它似乎起作用了。
看来eax实际上正在读取向量的4个字节而不是1个字节。
不管怎么说,多谢拉。 :)