2011-11-04 69 views
1

這是一個家庭作業,如果任何人的好奇。選擇排序在x86彙編

任務是讓C程序創建一個二維數組並將該數組傳遞到程序集中,然後使用選擇排序來對其進行排序。

我試圖運行它時出現的錯誤是分段錯誤。我試過了

push tesst 
push sout 
call printf 

在終端窗口打印出「測試」,但我找不出它來自哪裏。我也試過在「輸入0,0」之後放正確,而且我還沒有得到一份測試結果。所以我完全不知道我在哪裏得到分段錯誤。

任何援助將非常感激。 :(由於明天晚上,我一直停留在這幾天的。有人提供一些線索,請

克里斯

的代碼將低於

我的C程序

#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:最簡單的方法可能是先將調用調入彙編並運行,以確保它不是導致問題的C代碼。

第2步:然後,將回調放入並加載到gdb或您最喜歡的源代碼級調試器。在第一個彙編程序指令中設置一個斷點。當它中斷時,檢查堆棧以確保它符合您的期望。

第3步:然後單步穿過裝配,直到找到問題所在。

這將是你最好的學習方法,並快速找到並解決您的問題。


我會告訴你一個件事,我看到一個潛在的問題。在iloop標籤後面,您有push esi。我看不到pop(或其他esp -modifying語句)在你的代碼的任何地方,更糟糕的,是push在循環中發生的事情。

如果您嘗試從堆棧指針與您輸入時不同的函數中返回,那麼您會遇到痛苦的世界。我可能只是錯過了一些東西,但我看那裏開始。

+0

謝謝比較()中的問題我甚至不知道現在回合gdb。我說女巫的手藝! :P非常感謝 – user1029072

+0

注意到並修復了。再次感謝 – user1029072