2015-03-03 65 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]加載數組大小?