C++ 多数组操作

C++ 多数组操作,c++,arrays,assembly,vector,C++,Arrays,Assembly,Vector,对于我的项目,我需要从一个文件中获取一个向量数组,然后需要将它与两个a和B向量进行比较,并需要找到a和B中哪一个更接近我们从文件中读取的向量 我已经做了C++部分(从文件中获取x值) < /p> 例如:对于X(1,3,5),A(2,4,6)(对于到X的距离是(| 2-1 |+| 4-3 |+| 6-5 |)=3),然后我需要对B执行相同的操作,并找出哪个值更小(这意味着更接近X向量) 基本上,对于3个大小的数组,我需要找出X和A的第一、第二和第三个元素之间的差异(然后需要它们总和的绝对值,然后

对于我的项目,我需要从一个文件中获取一个向量数组,然后需要将它与两个a和B向量进行比较,并需要找到a和B中哪一个更接近我们从文件中读取的向量

<强>我已经做了C++部分(从文件中获取x值)<强> < /p> 例如:对于X(1,3,5)A(2,4,6)对于到X的距离是(| 2-1 |+| 4-3 |+| 6-5 |)=3),然后我需要对B执行相同的操作,并找出哪个值更小(这意味着更接近X向量)

基本上,对于3个大小的数组,我需要找出X和A的第一、第二和第三个元素之间的差异(然后需要它们总和的绝对值,然后我需要对B执行此操作,然后比较两个值)

但我真的被装配零件卡住了:

到目前为止,我知道要找到距离我需要使用此代码来找到绝对值,但在下面使用此代码之前,我需要找到两个元素之间的差异,然后应用此代码来找到绝对值

下面是查找绝对值的代码段,我不知道这是否有帮助:

mov ebx, eax     ; move eax to ebx
neg eax          ; eax = -eax
cmovl eax, ebx   ; if negative move ebx back to eax
但是我的主要问题是:如何从X和A中提取第一个元素,以获得它们在汇编中的元素之间的差异。(也需要对两个数组的2th3th值执行此操作。然后,我需要对X和B执行相同的操作,但如果你给我演示A,我确信我可以对B应用相同的算法。)

我的C++函数集的装配函数是:

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

并将A和B定义为包含3个成员的数组。

您可以使用间接寻址访问数组

像这样:

;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

正如您所看到的,这两个示例之间的差别很小。我更喜欢cdq变体,因为它更优雅。

您可以使用间接寻址访问阵列

像这样:

;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

正如您所看到的,这两个示例之间的差异非常小。我只是更喜欢cdq变体,因为它更优雅。

到底是什么原因导致您出现问题?您可以访问数组项吗?@Jester抱歉,我这次试图简要解释。基本上我需要访问数组项,然后找到它们之间的差异。具体原因是什么ng你有问题吗?你能访问数组项吗?@Jester抱歉,我这次试图简单地解释一下。基本上我需要访问数组项,然后找出它们之间的区别。Thnx但是我在这段代码中遇到的一个问题是数组1和数组2未定义。我如何在这段代码中定义它们?将它们作为参数传递并调整
mov esi,Array1
让esi使用该参数。我这样做了,但这次仍然不起作用,它在
push
的行中给出了无效的指令操作数错误。我已经测试了代码,它起作用了,你必须自己翻译。因此每个项目只允许一个问题。这实际上是一个新问题。如果你继续卡住,问一个新问题:<代码>我如何得到这个代码在C++(版本x.xx)下编译/运行在Linux/Windows/BSD/..使用x86/x64组件调用……y?选择作为答案nx,但我在这段代码中遇到的一个问题是,Array1和Array2未定义。我如何在这段代码中定义它们?将它们作为参数传递,并调整
mov esi,Array1
,让esi使用该参数。我这样做了,但仍然不起作用。这一次它给出了无效的指令操作数错误我已经测试了代码,它工作了,你必须自己做翻译。所以每项只允许一个问题。这实际上是一个新问题。如果你一直被卡住,问一个新问题:<代码>我如何得到这段代码在C++(XXXX)版本下编译/运行?在linux/windows/bsd/下使用调用约定Y…使用x86/X64程序集?明白了。描述代码和解释。:)选择作为答案