2015-03-03 2 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 
} 

изменение ARRAYSIZE от 15 до 2130567168 сразу после линии

move ebp, esp 

Что случилось с моим кодом?

ответ

0

Компилятор предполагает, что ваши параметры находятся в определенном месте в стеке. Когда вы нажимаете на стек, вы изменяете значение указателя стека и, следовательно, беспорядок с предположениями компилятора.

+0

Спасибо, я получил его сейчас – hvuong91

0

Вы не называете компилятор, вызывающие соглашения или что-то еще.

Многие вопросы можно ответить, проверив сгенерированный ассемблер, как призвание, и сформированной функцию

  • делает компилятор генерирует больше коды для этой функции? Возможно, он уже генерирует стек.
  • какая инструкция компилятор генерирует код для mov ecx, arraySize? регистр, EBP относительный или ESP относительный? Если это ESP относительный, компилятор считает, что это бескаркасная функция, даже если вы сами создаете кадр самостоятельно.
  • Проверьте код вызова, как будут подготовлены параметры. Вы загружаете массив, обращаясь к [ebp + 8], поэтому, предполагая соглашения о стеках, почему бы не загрузить массивы с помощью [ebp + 12]?
Смежные вопросы