Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 汇编—将寄存器推入堆栈后的参数更改_Function_Assembly_Parameters - Fatal编程技术网

Function 汇编—将寄存器推入堆栈后的参数更改

Function 汇编—将寄存器推入堆栈后的参数更改,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

我正在使用汇编代码实现选择排序。在selection sort函数中,在我将寄存器推入堆栈之后,参数的值立即改变 这是总机呼叫,大小为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
}
该行之后,阵列大小从15更改为2130567168

    move ebp, esp

我的代码有什么问题吗?

编译器假定您的参数位于堆栈上的特定位置。当您推到堆栈时,会更改堆栈指针的值,因此会弄乱编译器的假设。

您不会命名编译器,也不会调用约定或其他任何东西

通过检查生成的汇编程序、调用和生成的函数,可以回答许多问题

  • 编译器是否为该函数生成更多代码?也许它已经生成了堆栈帧
  • 编译器为mov ecx、arraySize生成什么样的指令?寄存器,EBP相对还是ESP相对?如果它是ESP相对的,编译器会认为它是一个无框架函数,即使您自己手动生成框架也是如此
  • 检查调用代码参数是如何准备的。您可以通过访问[ebp+8]来加载阵列,因此假设采用堆栈约定,为什么不使用[ebp+12]来加载阵列大小