2017-05-25 52 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