汇编 - 将寄存器压入堆栈后参数更改

时间:2015-03-03 07:56:41

标签: function assembly parameters

我正在使用汇编代码实现选择排序。在选择排序功能中,在我将寄存器推入堆栈后,参数值就会发生变化 这是主要的呼叫,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

我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:0)

编译器假定您的参数位于堆栈上的特定位置。当你推送到堆栈时,你改变了堆栈指针的值,因此搞乱了编译器的假设。

答案 1 :(得分:0)

您不会命名编译器,调用约定或其他任何内容。

通过检查生成的汇编程序,调用和生成的函数

,可以回答许多问题
  • 编译器是否为此函数生成了更多代码?也许它已经生成了一个堆栈框架。
  • 编译器为mov ecx,arraySize生成什么样的指令?注册,EBP亲属还是ESP相对?如果它是ESP相对的,编译器认为它是一个无框功能,即使你自己手动生成帧。
  • 检查调用代码如何准备参数。你通过访问[ebp + 8]加载数组,所以假设堆栈约定,为什么不使用[ebp + 12]加载数组?