2013-04-29 66 views
6

我有兩個向量;其中一個(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的內容。

有誰知道我做錯了什麼?

回答

0

兩個明顯的錯誤開始與

MOV EDI,5

,但第一CMP具有EDI-1,所以它開始於

====

MOV RCX,10

,但第一CMP已RCX-1,所以它開始於9

====

CMP EDI,0

JNE CHARACTER_1

MOV RCX,10

CHARACTER_1復位10在EDI循環的中間環路,是可以嗎?

====

不知道是什麼RCX的,我認爲它的ECX被用來循環character_2

MOV RCX,10我猜就是十數字,而不是16個二進制

一旦你排序的所有格菲小細節出它會動搖,但魔鬼在這些蠅頭程序的詳細

=========

「如果最後VectorA的數目是9,它實際上轉到found_it標籤」

這是因爲跳轉總是在10復位RCX,然後有一個CMP RCX-1(因此RCX = 9)

如此這般10 9 10 CMP 9 CMP 10 9 CMP而不是10 CMP 9 CMP 8 CMP 7 6等

+0

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

0

CHARACTER_1:

MOV RCX,10; VectorB是10位矢量。

character_2:

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

cmp eax, [VectorB+rcx-1]  

je found_it  

環character_2

如果沒有匹配這裏會發生什麼?

EDI將EDI-1永遠

你仍然需要找到一種方式來貶低EDI

EDI = EDI-1有點兒事

你做

月EDI

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

+0

那是因爲如果沒有匹配,那麼在搜索中就沒有意義了。當它在VectorA中找到一個不是VectorB的一部分的單個數字時,整個VectorA變得無效,並且程序退出,通過eax返回1。 – user2333787 2013-04-30 14:49:43

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.

無論如何感謝。 :)