汇编程序 - 数组问题
Assembler - trouble with arrays
我在汇编程序中遇到了一些问题,它负责将一个数组复制到另一个数组(整数数组)。
这是我在 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++ 中它工作正常。在汇编程序中我遇到了麻烦。只有第一个元素被正确复制。其余元素不变。
代码:
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
例如:
myArray [1] = 10 [2] = 11 [3] = 3 [4] = 13...
newArray before procedure [1] = 0 [2] = 0 [3] = 0 [4] = 0...
newArray after procedure [1] = 10 [2] = 0 [3] = 0 [4] = 0...
我认为 DWORD/BYTE 有一些问题。我尝试将 ecx 更改为 [ecx+4] 和其他组合,但我不知道如何修复代码。
感谢您的帮助:)
我认为你至少有两个问题。第一,您没有缩放整数大小。您必须将指针增加 4 倍的项目数。另一个问题是你正在尝试使用 eax
作为循环计数器,但同时你也将它用作副本的临时,所以你覆盖了你的计数器。
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: 你应该学会使用调试器,这样你就可以修复自己的错误。
我在汇编程序中遇到了一些问题,它负责将一个数组复制到另一个数组(整数数组)。
这是我在 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++ 中它工作正常。在汇编程序中我遇到了麻烦。只有第一个元素被正确复制。其余元素不变。 代码:
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
例如:
myArray [1] = 10 [2] = 11 [3] = 3 [4] = 13...
newArray before procedure [1] = 0 [2] = 0 [3] = 0 [4] = 0...
newArray after procedure [1] = 10 [2] = 0 [3] = 0 [4] = 0...
我认为 DWORD/BYTE 有一些问题。我尝试将 ecx 更改为 [ecx+4] 和其他组合,但我不知道如何修复代码。
感谢您的帮助:)
我认为你至少有两个问题。第一,您没有缩放整数大小。您必须将指针增加 4 倍的项目数。另一个问题是你正在尝试使用 eax
作为循环计数器,但同时你也将它用作副本的临时,所以你覆盖了你的计数器。
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: 你应该学会使用调试器,这样你就可以修复自己的错误。