Выбор сортировки на сборке x86 - PullRequest
1 голос
/ 04 ноября 2011

Это домашнее задание, если кому-то интересно.

Задача состоит в том, чтобы программа на C создала двумерный массив и передала этот массив в сборку, которую нужно отсортировать с помощью сортировки выбора.

Ошибка, возникающая при попытке запуска, является ошибкой сегментации.Я попытался поместить

push tesst
push sout
call printf

, чтобы распечатать "тест" в окне терминала, но я не мог понять, откуда он идет.Я также попытался поставить его сразу после «введите 0,0», и я до сих пор не получил отпечаток из теста.Так что у меня совершенно нет идей относительно того, где я получаю ошибку сегментации.

Любая помощь будет принята с благодарностью.:( Завтра вечером, и я застрял в этом пару дней. Кто-нибудь пролил немного света, пожалуйста

-Chris

Коды будут ниже

myc программа

#include <stdio.h>

int ssort(char * hi[], int x, int y);

int main(){

  int i, j;


  char hi[3][5] = {"Yoshi", "Annie", "Chris"};

  printf("Display Unsorted Strings\n");
  for(i = 0; i < 3; i++){
    for(j = 0; j < 5; j++){
      printf("%c", hi[i][j]);
    }
    printf("\n");
  }
  printf("It Got Here\n");
  ssort((char*)hi, 5, 3);
  printf("Sorted\n");
  for(i = 0; i < 3; i++){
    for(j = 0; j < 5; j++){
      printf("%c", hi[i][j]);
    }
    printf("\n");
  }
}

и мой код сборки

extern    printf

segment   .data

tesst db  't','e','s','t',0
sout  db  "%s", 10, 0

segment   .text

  global  ssort

ssort:    
  enter   0,0

;;; for(i = 0; i < namecount; i++){
;;;   for(j = 1; j < namecount; j++){
;;;       if(array[i] < array[j])
;;;           do nothing
;;;       else
;;;           swap
;;;   }
;;; }


  mov esi,    [ebp+8] 
  mov edi,    esi
  add edi,    [ebp+8]
  mov ecx,    0   ;i
  mov edx,    0
  add edx,    1   ;j
  ;; [ebp+16] = namecount

iloop:
  push    esi
  cmp ecx,    [ebp+16]
  je  done_sorting
jloop:
  cmp edx,    [ebp+16]
  je  j_done

;;; compare here now
compare:
  mov al, [esi]
  mov bl, [edi]
  cmp al, bl
  jg  alisbigger
  jl  blisbigger
  inc esi
  inc edi
  jmp compare
alisbigger:   
  jmp swap
blisbigger:   
  jmp done

swap:
  mov ebx,    0
  mov ebx,    [ebp+12]
swap_loop:
  dec ebx

  mov al, [esi]
  mov bl, [edi]
  mov [esi],  bl
  mov [edi],  al

  inc esi
  inc edi

  cmp ebx,    0
  je  done
  jmp swap_loop

done:
  inc edx
  jmp jloop

j_done:
  add ecx, 1
  add esi, [ebp+12]
  mov edx, 1
  jmp iloop   


done_sorting:
  leave
  ret

1 Ответ

1 голос
/ 04 ноября 2011

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

Шаг 1: Вероятно, самый простой способ - сначала вывести вызов в сборку и запустить его, чтобы убедиться, что проблема не в вашем коде C.

Шаг 2: Затем поместите вызов обратно ви загрузите его в gdb или ваш любимый отладчик исходного уровня.Установите точку останова в первой инструкции на ассемблере.Когда он сломается, проверьте стек, чтобы убедиться, что он соответствует вашим ожиданиям.

Шаг 3: Затем выполните один шаг по сборке, пока не найдете свою проблему.

Это будетлучший способ узнать и быстро найти и решить вашу проблему.


Я расскажу вам одну вещь, которую я вижу в качестве потенциальной проблемы.Сразу после метки iloop у вас есть push esi.Я не вижу pop (или другого esp -модифицирующего оператора) в любом месте в вашем коде и, что еще хуже, push происходит в цикле.

Если вы попытаетесь вернуться из функции с указателем стека, отличным от того, который был при вводе, вы испытываете мир боли.Возможно, я просто что-то упустил, но я бы начал с того, что посмотрел туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...