我如何获得另一个柜台?
How do I get another counter?
我正在尝试比较 C++ 和 MASM 之间的冒泡排序。我已经让 C++ 正常工作了。然而,对于 MASM,我需要在 loopSwap 中使用另一个计数器,但我不知道如何去做。
我知道如果我压入一个寄存器,它必须在比较之前但是如果遇到比较跳转,我将无法弹出相同的寄存器。
感谢任何帮助!
C++代码:
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int deepBlueDecend(int* num, int size);
int deepBlueAscend(int* num, int size);
//int setArray(int* num, int size);
extern"C"
{
int KasparovAscend(int *, int);
int KasparovDecend(int *, int);
}
int main()
{
int ascOrDec = 2, size = 0;
cout << "How big do you want the array to be sorted? ";
cin >> size;
int* myArray = 0;
myArray = new int[size];
int* asmArray = 0;
asmArray = new int[size];
srand((unsigned)time(0)); // gets actually random numbers somehow
for (int i = 0; i < size; i++) //populates the arrays with random numbers
{
myArray[i] = rand();
asmArray[i] = myArray[i];
}
for (int i = 0; i < size; i++) cout << asmArray[i] << " "; //displays asmArray[]
cout << endl;
while (ascOrDec < 0 || ascOrDec > 1) //test if ascending or decending has been chosen
{
cout << "Ascending (0) or decending(1)? ";
cin >> ascOrDec;
if (ascOrDec == 0 || ascOrDec == 1)
break;
}
cout << endl;
if (ascOrDec == 0)
{
KasparovAscend(asmArray, size);
for (int i = 0; i < size; i++) cout << asmArray[i] << " "; //to see if anything changed in the assembly sort
cout << endl;
clock_t startTime = clock();
deepBlueAscend(myArray, size);
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double)CLOCKS_PER_SEC;
for (int i = 0; i < size; i++) cout << myArray[i] << " "; //to see if anything changed in the C++ sort
cout << "\nTime Taken for c++: " << clockTicksTaken << endl;
}
else
{
clock_t startTime = clock();
deepBlueDecend(myArray, size);
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double)CLOCKS_PER_SEC;
cout << "\nTime Taken for c++: " << clockTicksTaken << endl;
}
system("pause");
return 0;
}
int deepBlueAscend(int* arr, int size)
{
int i, j, flag = 1; // set flag to 1 to start first pass
int temp; // holding variable
for (i = 1; (i <= size) && flag; i++)
{
flag = 0;
for (j = 0; j < (size - 1); j++)
{
if (arr[j + 1] < arr[j]) // ascending order <
{
temp = arr[j]; // swap elements
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1; // indicates that a swap occurred.
}
}
}
return 0;
}
int deepBlueDecend(int* arr, int size)
{
int i, j, flag = 1; // set flag to 1 to start first pass
int temp; // holding variable
for (i = 1; (i <= size) && flag == 1; i++)
{
flag = 0;
for (j = 0; j < (size - 1); j++)
{
if (arr[j + 1] > arr[j]) // decending order >
{
temp = arr[j]; // swap elements
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1; // indicates that a swap occurred.
}
}
}
return 0;
}
和 MASM 代码:
.686
.model flat
.code
_help PROC ; named _test because C automaticedxly prepends an underscode, it is needed to interoperate
push ebp
mov ebp,esp ; stack pointer to ebp
mov ebx, [ebp+8] ; address of first array element
mov ecx, [ebp+12] ; number of elements in array
mov ebp, ecx
mov edx, 0
mov eax, 0
push edi ;save this
push ebx ;save this
mov edi, ebx ;make a copy of first element in array
add edi, 4 ;move 4 to find second element
mov edx, [ebx] ;move first element into edx
mov eax, [edi] ;move second element into eax
LoopTraverse:
dec ecx
cmp ecx, 0
je AllDone
;set counter in loopSwap to be 0 when first entered
LoopSwap:
inc ebp ;increment
cmp ecx, eax ;compares counter to number of elements
je LoopTraverse
cmp edx, eax ;comparing the two values
jg NextElements
push ecx ;stores eax so it can be used for later
push edx ;stores edx so it can be used later
xchg ebx, edi ;trade the two elements
mov ecx, edi
mov edx, ebx
xchg [ebp+eax], edx
xchg [ebp], ecx
pop edx
pop ecx
NextElements:
add edi, 4 ;finds next
add ebx, 4 ;finds second element
mov eax, [edi]
mov edx, [ebx]
allDone:
mov eax, ebp
pop edi
pop edx
pop ebp;
ret
_help ENDP
END
- 不要不要使用
ebp
作为变量。
- 在
mov ebp,esp
之后执行 sub esp, 4
以在堆栈中为另一个循环计数器腾出空间。
- 在
[ebp-4]
处设置新的循环计数器。
- 由于不允许使用
ebp
作为变量,因此您将需要一个堆栈变量;所以,而不是 sub esp, 4
做 sub esp, 8
并且你的第二个堆栈变量在 [ebp-8]
.
我正在尝试比较 C++ 和 MASM 之间的冒泡排序。我已经让 C++ 正常工作了。然而,对于 MASM,我需要在 loopSwap 中使用另一个计数器,但我不知道如何去做。
我知道如果我压入一个寄存器,它必须在比较之前但是如果遇到比较跳转,我将无法弹出相同的寄存器。
感谢任何帮助!
C++代码:
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int deepBlueDecend(int* num, int size);
int deepBlueAscend(int* num, int size);
//int setArray(int* num, int size);
extern"C"
{
int KasparovAscend(int *, int);
int KasparovDecend(int *, int);
}
int main()
{
int ascOrDec = 2, size = 0;
cout << "How big do you want the array to be sorted? ";
cin >> size;
int* myArray = 0;
myArray = new int[size];
int* asmArray = 0;
asmArray = new int[size];
srand((unsigned)time(0)); // gets actually random numbers somehow
for (int i = 0; i < size; i++) //populates the arrays with random numbers
{
myArray[i] = rand();
asmArray[i] = myArray[i];
}
for (int i = 0; i < size; i++) cout << asmArray[i] << " "; //displays asmArray[]
cout << endl;
while (ascOrDec < 0 || ascOrDec > 1) //test if ascending or decending has been chosen
{
cout << "Ascending (0) or decending(1)? ";
cin >> ascOrDec;
if (ascOrDec == 0 || ascOrDec == 1)
break;
}
cout << endl;
if (ascOrDec == 0)
{
KasparovAscend(asmArray, size);
for (int i = 0; i < size; i++) cout << asmArray[i] << " "; //to see if anything changed in the assembly sort
cout << endl;
clock_t startTime = clock();
deepBlueAscend(myArray, size);
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double)CLOCKS_PER_SEC;
for (int i = 0; i < size; i++) cout << myArray[i] << " "; //to see if anything changed in the C++ sort
cout << "\nTime Taken for c++: " << clockTicksTaken << endl;
}
else
{
clock_t startTime = clock();
deepBlueDecend(myArray, size);
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double)CLOCKS_PER_SEC;
cout << "\nTime Taken for c++: " << clockTicksTaken << endl;
}
system("pause");
return 0;
}
int deepBlueAscend(int* arr, int size)
{
int i, j, flag = 1; // set flag to 1 to start first pass
int temp; // holding variable
for (i = 1; (i <= size) && flag; i++)
{
flag = 0;
for (j = 0; j < (size - 1); j++)
{
if (arr[j + 1] < arr[j]) // ascending order <
{
temp = arr[j]; // swap elements
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1; // indicates that a swap occurred.
}
}
}
return 0;
}
int deepBlueDecend(int* arr, int size)
{
int i, j, flag = 1; // set flag to 1 to start first pass
int temp; // holding variable
for (i = 1; (i <= size) && flag == 1; i++)
{
flag = 0;
for (j = 0; j < (size - 1); j++)
{
if (arr[j + 1] > arr[j]) // decending order >
{
temp = arr[j]; // swap elements
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1; // indicates that a swap occurred.
}
}
}
return 0;
}
和 MASM 代码:
.686
.model flat
.code
_help PROC ; named _test because C automaticedxly prepends an underscode, it is needed to interoperate
push ebp
mov ebp,esp ; stack pointer to ebp
mov ebx, [ebp+8] ; address of first array element
mov ecx, [ebp+12] ; number of elements in array
mov ebp, ecx
mov edx, 0
mov eax, 0
push edi ;save this
push ebx ;save this
mov edi, ebx ;make a copy of first element in array
add edi, 4 ;move 4 to find second element
mov edx, [ebx] ;move first element into edx
mov eax, [edi] ;move second element into eax
LoopTraverse:
dec ecx
cmp ecx, 0
je AllDone
;set counter in loopSwap to be 0 when first entered
LoopSwap:
inc ebp ;increment
cmp ecx, eax ;compares counter to number of elements
je LoopTraverse
cmp edx, eax ;comparing the two values
jg NextElements
push ecx ;stores eax so it can be used for later
push edx ;stores edx so it can be used later
xchg ebx, edi ;trade the two elements
mov ecx, edi
mov edx, ebx
xchg [ebp+eax], edx
xchg [ebp], ecx
pop edx
pop ecx
NextElements:
add edi, 4 ;finds next
add ebx, 4 ;finds second element
mov eax, [edi]
mov edx, [ebx]
allDone:
mov eax, ebp
pop edi
pop edx
pop ebp;
ret
_help ENDP
END
- 不要不要使用
ebp
作为变量。 - 在
mov ebp,esp
之后执行sub esp, 4
以在堆栈中为另一个循环计数器腾出空间。 - 在
[ebp-4]
处设置新的循环计数器。 - 由于不允许使用
ebp
作为变量,因此您将需要一个堆栈变量;所以,而不是sub esp, 4
做sub esp, 8
并且你的第二个堆栈变量在[ebp-8]
.