c - x86 程序集上的选择排序

标签 c sorting assembly x86 selection

如果有人好奇的话,这是一个家庭作业。

任务是让 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/

相关文章:

c++ - 如何在 C++ 中使用内联汇编来设置 Trap 标志

c - 动态 C 字符串 (char*) 奇怪的行为

c - sprintf、printf 和格式说明符

java - 如何对两个字符串数组进行排序

python - 如何按字母顺序排列 Django admin 中的下拉列表?

linux - i386 和 x86-64 上的 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么

C:在多线程程序中使用clock()测量时间

c - 我需要打印行号以及行内容,但我得到了 2 个不同行中的行号和内容

database - 在 Cassandra 的一些表之间同步(复制)数据的标准方法是什么?

c - 了解汇编中的 C 程序