汇编 - 寄存器被压入堆栈后参数发生变化
Assembly - Parameter changes after register being pushed into the stack
我正在使用汇编代码实现选择排序。在选择排序函数中,在我将寄存器压入堆栈后,参数的值发生了变化
这是主要的调用,SIZE =15
array_selection_sort(arrayOfNumbers1, SIZE);
这里是排序函数
void array_selection_sort(int arrayOfIntegers[], int arraySize)
{
__asm{
// BEGIN YOUR CODE HERE
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
push esi
push edi
//assign variables
//ebx = array, ecx = array size - 1, edi = j, edx as temp, esi and edi used for swapping
mov ebx, [ebp + 8]
mov ecx, arraySize
}
行后 arraySize 从 15 变为 2130567168
move ebp, esp
我的代码有问题吗?
编译器假定您的参数位于堆栈的特定位置。当您压入堆栈时,您更改了堆栈指针的值,因此与编译器假设相混淆。
您没有命名编译器、调用约定或其他任何名称。
许多问题可以通过检查生成的汇编程序、调用和生成的函数来回答
- 编译器是否会为此函数生成更多代码?也许它已经生成了一个堆栈框架。
- 编译器为 mov ecx, arraySize 生成什么样的指令?注册,EBP 亲戚还是 ESP 亲戚?如果是ESP relative,编译器认为是frameless function,即使你自己手动生成frame。
- 检查调用代码如何准备参数。您通过访问 [ebp+8] 加载数组,所以假设堆栈约定,为什么不使用 [ebp+12] 加载数组大小?
我正在使用汇编代码实现选择排序。在选择排序函数中,在我将寄存器压入堆栈后,参数的值发生了变化 这是主要的调用,SIZE =15
array_selection_sort(arrayOfNumbers1, SIZE);
这里是排序函数
void array_selection_sort(int arrayOfIntegers[], int arraySize)
{
__asm{
// BEGIN YOUR CODE HERE
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
push esi
push edi
//assign variables
//ebx = array, ecx = array size - 1, edi = j, edx as temp, esi and edi used for swapping
mov ebx, [ebp + 8]
mov ecx, arraySize
}
行后 arraySize 从 15 变为 2130567168
move ebp, esp
我的代码有问题吗?
编译器假定您的参数位于堆栈的特定位置。当您压入堆栈时,您更改了堆栈指针的值,因此与编译器假设相混淆。
您没有命名编译器、调用约定或其他任何名称。
许多问题可以通过检查生成的汇编程序、调用和生成的函数来回答
- 编译器是否会为此函数生成更多代码?也许它已经生成了一个堆栈框架。
- 编译器为 mov ecx, arraySize 生成什么样的指令?注册,EBP 亲戚还是 ESP 亲戚?如果是ESP relative,编译器认为是frameless function,即使你自己手动生成frame。
- 检查调用代码如何准备参数。您通过访问 [ebp+8] 加载数组,所以假设堆栈约定,为什么不使用 [ebp+12] 加载数组大小?