2015-03-03 62 views
0

我正在使用汇编代码实现选择排序。在选择排序功能,之后我把寄存器入堆栈,参数的值更改 下面是主要的号召,与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 
} 

从15到2130567168行

move ebp, esp 

右后ARRAYSIZE变化有什么错我的代码?

回答

0

编译器假定您的参数位于堆栈上的特定位置。当你推入堆栈时,你改变了堆栈指针的值,因此与编译器假设相混淆。

+0

谢谢,我现在明白了 – hvuong91 2015-03-04 02:50:26

0

你不指定编译器,调用约定或其他。

许多问题都可以通过检查生成的汇编来回答,无论是通话,并且将生成的功能

  • 没有编译器生成此功能的任何代码?也许它已经产生了一个栈帧。
  • 编译器为mov ecx,arraySize生成什么样的指令?注册,EBP相对或ESP相对?如果它是ESP相对的,编译器认为它是一个无框功能,即使您自己手动生成框架。
  • 检查调用代码参数如何准备。您通过访问[ebp + 8]加载数组,因此,如果采用堆栈约定,为什么不使用[ebp + 12]加载数组大小?