2017-05-25 80 views
1

我的項目,我需要從文件中的向量數組,那麼需要將它與兩個A和B向量比較和需要找到A的哪一個和B更接近我們從文件中讀取矢量。多陣列操作

我已經做的C++部分(以X的值從文件等)

例如:爲X(1,3,5)A(2,4, 6)用於向X的距離(| 2-1 | + | 4-3 | + | 6-5 |)= 3)然後我需要做相同的操作對於B和發現其值是更小(這意味着更接近X矢量)

基本上我需要3個大小的陣列發現X和A的第1,第2和第3個元素之間的差異(這時需要它們的和的絕對值,然後我需要做此爲B,則比較兩個值)

但我真的堅持的大會部分:

到目前爲止,我知道找距離我需要使用此代碼找到絕對值但使用該代碼的樓下,我需要找到兩個要素間的差異在此之前將此代碼找到絕對值

這裏是代碼塊尋找絕對值我不知道是否有幫助:

mov ebx, eax  ; move eax to ebx 
neg eax   ; eax = -eax 
cmovl eax, ebx ; if negative move ebx back to eax 

但我主要問題是我如何可以採取不同於X的第一要素和一大家子的區別他們的元素在大會。(需要這樣做第2第3這兩個數組的值以及然後我需要做相同的操作爲X和B,但如果你告訴我爲A我確定我可以應用相同的算法B

大會功能的我的C++原型是這樣的:

distance(int n, int * Xptr, int * Aptr, int * Bptr); 

,並用3個構件限定A和B作爲陣列

+0

究竟是什麼導致你的問題?你可以訪問數組項目嗎? – Jester

+0

@Jester對不起,我這次試圖簡單解釋一下。基本上我需要訪問數組項然後找到它們之間的區別。 –

回答

0

您使用間接尋址

訪問數組。

像這樣:

;ecx = number of items in the array 
push ebx 
push esi 
push edi 
xor ebx,ebx  ;outcome is zero. 
mov esi,Array1  ;esi = address of array1 
mov edi,Array2  ;edi = address of array2 
add esi,ecx  ;esi = end of array 
add edi,ecx  ;edi = end of array 
neg ecx   ;start at the beginning of each array 
jz done   ;count is zero, nothing to do 
loop:    ;for (i=0;i<count;i++) 
    mov edx,[edi+ecx] ;edx = Array1[i] or Array1[start+length-count] 
    mov eax,[esi+ecx] ;ebx = Array2[i] 
    sub eax,edx  ;calculate difference 
    cdq    ;edx = eax < 0? -1:0 
    add eax, edx 
    xor eax, edx  ;eax = abs(eax) 
    add ebx,eax   
    inc ecx   ;i++ 
jnz loop 
done: 
mov eax,ebx 
pop edi 
pop esi 
pop ebx 
ret 

讓我走你的代碼。
我們先將總和設置爲零並設置指向數組的指針。
然後我們否定計數並更新指向數組末尾的指針。
這個看似複雜的設置是速度劈,它可以讓你從-count數到零,而不必保持周圍一個額外的變量來跟蹤該數組的索引。
然後我們做了一些神奇的事情來做一個abs,而不必做跳轉或有條件的移動。

你可以調用這個例程兩次。一旦獲得abs(A[]-X[])並再次獲得abs(B[]-X[])

爲ABS伎倆,請參閱:https://www.strchr.com/optimized_abs_function

你必須做一些改變來調整它的調用約定。我將這作爲練習給讀者。您可以調整代碼以便一次完成所有的比較,我也留給讀者。

只是爲了好玩,讓我們挑開的ABS樣品:

Alt-A   cycles bytes  Alt B  cycles bytes 

    mov ebx, eax  0  2   cdq   1   1 
    neg eax   1  2   add eax,edx 1   2 
    cmovl eax, ebx 2  3   xor eax,edx 1   2 

正如你可以看到有兩個樣本之間只有細微的差別。我更喜歡cdq版本,因爲它更優雅。

+0

這僅適用於X陣列和陣列的權利? –

+0

Thnx但我在這段代碼中遇到麻煩的一點是Array1和Array2未定義。我如何在這段代碼中定義它們? –

+0

將它們作爲參數傳遞,並調整'mov esi,Array1'讓esi消耗該參數。 – Johan