我有兩個向量;其中一個(VectorA)由用戶引入,另一個(VectorB)包含一串單個數字。它們都是char向量。這個想法是,程序必須逐個比較VectorA的數量,以確保它們是有效的數字,將它們與VectorB中的數據進行比較,其中包含所有可用的有效數字。比較彙編中的向量
如果VectorA中的所有數字都包含在VectorB中,則程序返回0.如果VectorA中任何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上找到它。
爲了進行調試,我在主要CMP
行的上方添加了一條mov esi, [VectorB+rcx-1]
行,在這兩行比較兩個值。我發現他們第一次進行比較時,ESI
具有正確的值。但是,程序第二次經歷該指令時,ESI
返回一個14648值,這當然不對應於下一行中的EAX
的內容。
有誰知道我做錯了什麼?
rcx和edi在cmp行中有-1,因爲它們需要經過各自向量的位置0-9和0-4,而不是1-10和1-5。 這應該是工作的方式:Edi正在搜索Vector1中的所有數字。對於每一個,rcx都會經過Vector2並開始比較這些數字。當他們發現巧合時,edi減少到Vector1中的下一個數字,rcx被重置爲10,因此它可以再次開始比較。如果單個rcx循環沒有跳轉到found_it標記,那麼意味着edi中的勇氣不在Vector2中,因此整個事情都停止了。 – user2333787 2013-04-30 03:09:34