1

我对汇编程序中的代码有一些问题,该代码负责将一个数组复制到另一个数组(整数数组)。

这就是我在 C++ 中创建数组的方式:

int *myArray=new int[myFunctions::getCounter()];
int *newArray;
int *newArray = new int[counter+1]; // I have some information in [0]

这就是我声明汇编程序功能的方式

extern int  copy(myArray[], int *newArray, int howManyElements, int howManyProcesses, int indexOfProcess);

关于流程:这是项目的一部分。过程(循环中)的工作方式如下:

在示例中,我们在数组中有 3 个进程和 10 个元素

第一个进程复制到新的数组元素中:[1] [4] [7] [10] 第二 [2] [5] [8] 第三 [3] [6] [9]

在 c++ 中:

for (int i=indexOfProcess; i<=howManyElements; i+=howManyProcess){

        newArray[i]  = myArray[i];

    }

在 c++ 中它工作正常。在汇编程序中我遇到了麻烦。只有第一个元素被正确复制。其余元素不变。MASM 代码:

copy proc uses ebx ecx edx esi edi myArray:DWORD, newArray:DWORD, howManyElements:DWORD, howManyProcesses:DWORD, indexOfProcess:DWORD
 
 
 
 
local ahowManyProcesses:DWORD 
local ahowManyElements:DWORD              
 
local  adressOfArray:DWORD
 
mov eax, howManyElements          
mov ahowManyElements, eax     
mov eax, howManyProcesses          
mov ahowManyProcesses, eax    
 
 
xor eax, eax            
 
mov ecx, indexOfProcess          
mov ebx, myArray       
mov edx, newArray   
mov adressOfTab, edx
 
 
add ebx, ecx               
add edx, ecx               
add eax, ecx                   
 
 
loop:
mov eax, [ebx]           
mov [edx], eax          
add ebx, ahowManyProcesses 
add edx, ahowManyProcesses
add eax, ahowManyProcesses
 
 
cmp eax, ahowManyElements 
jbe loop                              
 
 
 
mov eax, adressOfArray
ret
 
copy endp
 
end

例如:

我的数组 [1] = 10 [2] = 11 [3] = 3 [4] = 13...

程序前的 newArray [1] = 0 [2] = 0 [3] = 0 [4] = 0...

newArray 在过程 [1] = 10 [2] = 0 [3] = 0 [4] = 0...

我认为 DWORD/BYTE 存在一些问题。我尝试将 ecx 更改为 [ecx+4] 和其他组合,但我不知道如何修复代码。

谢谢您的帮助 :)

4

1 回答 1

0

我认为你至少有两个问题。一,您没有缩放整数大小。您必须将指针增加 4 倍的项目数。另一个问题是您尝试使用eaxfor 循环计数器,但同时您也将它用作副本的临时对象,因此您覆盖了您的计数器。

mov ecx, indexOfProcess          
mov ebx, myArray       
mov edx, newArray   
mov adressOfTab, edx

lea ebx, [ebx+ecx*4]       ; scale by 4 for int size
lea edx, [edx+ecx*4]       ; scale by 4 for int size

loop:
mov eax, [ebx]
mov [edx], eax
mov eax, ahowManyProcesses ; the increment in items
lea ebx, [ebx+eax*4]       ; scale by 4 for int size
lea edx, [edx+eax*4]       ; scale by 4 for int size
add ecx, eax               ; do not scale, it is a counter

cmp ecx, ahowManyElements 
jbe loop

PS:你应该学会使用调试器,这样你就可以修复自己的错误。

于 2015-01-19T01:30:09.723 回答