Function 汇编—将寄存器推入堆栈后的参数更改
我正在使用汇编代码实现选择排序。在selection sort函数中,在我将寄存器推入堆栈之后,参数的值立即改变 这是总机呼叫,大小为15Function 汇编—将寄存器推入堆栈后的参数更改,function,assembly,parameters,Function,Assembly,Parameters,我正在使用汇编代码实现选择排序。在selection sort函数中,在我将寄存器推入堆栈之后,参数的值立即改变 这是总机呼叫,大小为15 array_selection_sort(arrayOfNumbers1, SIZE); 这是排序函数 void array_selection_sort(int arrayOfIntegers[], int arraySize) { __asm{ // BEGIN YOUR CODE HERE push ebp m
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
}
该行之后,阵列大小从15更改为2130567168
move ebp, esp
我的代码有什么问题吗?编译器假定您的参数位于堆栈上的特定位置。当您推到堆栈时,会更改堆栈指针的值,因此会弄乱编译器的假设。您不会命名编译器,也不会调用约定或其他任何东西 通过检查生成的汇编程序、调用和生成的函数,可以回答许多问题
- 编译器是否为该函数生成更多代码?也许它已经生成了堆栈帧
- 编译器为mov ecx、arraySize生成什么样的指令?寄存器,EBP相对还是ESP相对?如果它是ESP相对的,编译器会认为它是一个无框架函数,即使您自己手动生成框架也是如此
- 检查调用代码参数是如何准备的。您可以通过访问[ebp+8]来加载阵列,因此假设采用堆栈约定,为什么不使用[ebp+12]来加载阵列大小