汇编 - 寄存器被压入堆栈后参数发生变化

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] 加载数组大小?