如果有人好奇的话,这是一个家庭作业。
任务是让 C 程序创建一个二维数组并将该数组传递到程序集中,程序集应使用选择排序对其进行排序。
我在尝试运行它时遇到的错误是段错误。我试过放置
push tesst
push sout
call printf
在终端窗口上打印出“测试”,但我不知道它是从哪里来的。我也试过把它放在“输入 0,0”之后,但我仍然没有打印出测试结果。所以我完全不知道我在哪里遇到段错误。
如有任何帮助,我们将不胜感激。 :( 明天晚上到期,我已经被困在这几天了。请有人阐明一下
-克里斯
代码如下
我的程序
#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 步:可能最简单的方法是首先将调用取出并运行它,以确保不是您的 C 代码导致问题。
第 2 步: 然后,将调用放回原处并将其加载到 gdb
或您最喜欢的源代码级调试器中。在第一条汇编指令上设置断点。当它中断时,检查堆栈以确保它符合您的预期。
第 3 步:然后单步执行程序集,直到找到问题。
这将是您学习、快速找到并解决问题的最佳方式。
我会告诉你一个我认为是潜在问题的事情。在 iloop
标签之后,您有 push esi
。我在您的代码中任何地方都看不到pop
(或其他esp
-修改语句),更糟糕的是,push
正在循环中发生。
如果您尝试从堆栈指针与您进入时的堆栈指针不同的函数返回,您将陷入世界的痛苦之中。我可能只是错过了一些东西,但我会从那里开始。
关于c - x86 程序集上的选择排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005047/