c - 排序算法 : assembly

标签 c assembly yasm

我正在用汇编语言(Linux、64 位、yasm)实现一个冒泡排序算法的函数。该函数从 C 文件中调用,其中数组和数组大小分别通过 rdi 和 rsi 传递给汇编。

  xor rax, rax
  xor rbx, rbx
  xor r14, r14                  ; r14 : int j = 0
  xor r15, r15                  ; r15 : boolean swapped
  inc r15                       ; swapped = true    (=> swapped = 1)

  while:  
    cmp r15, 1                  ; while (swapped)   (=> check if  swapped == 1)
    jne end_while   

    dec r15                     ; swapped = false   (=> swapped = 0)
    inc r14                     ; j++    
    mov rdx, rsi                ; rdx = size
    sub rdx, r14                ; size - j
    xor rcx, rcx                ; int i = 0

  for:
    cmp rcx, rdx                ; i < size - j
    je end_for

    mov rax, [rdi+rcx*4+4]      ; rax = rdi+rcx*4+4 => arr[i+1]
    mov rbx, [rdi+rcx*4]        ; rbx = rdi+rcx*4   => temp = arr[i]

    cmp rbx, rax                ; if(arr[i] > arr[i+1])
    jng done_if

    mov  [rdi+rcx*4], rax       ; arr[i] = arr[i+1]
    mov  [rdi+rcx*4+4], rbx     ; arr[i+1] = temp        
    inc r15                     ; swapped = true (=> swapped = 1)

    done_if:

    inc rcx                     ; ++i
    jmp for

  end_for:  
  end_while:
    ret

数组只对整数进行排序。我用 Java 编写了 bubblesort 代码并在那里进行了测试 - 它工作正常。但是,当我通过 C 文件传递​​数组 {9,8,7,6,5,4,3,2,1,0} 时,输出为 {8,8,8,8,8,8,8, 8,8,9}。我用gdb调试了,还是看不出问题出在哪里。 for 循环结构工作正常(rcx 和 rdx 功能正常)。似乎访问数组元素的方式可能存在问题。 任何建议将不胜感激。

最佳答案

您的问题是您到处都在使用四字(64 位整数),但您的数组中充满了双字(32 位整数)。特别是,您使用 mov rax, [rdi+rcx*4+4] 的部分应更改为 movl eax, [rdi+rcx*4+4] ,而其他 mov 指令也应类似地更改为 movl

关于c - 排序算法 : assembly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216102/

相关文章:

c - 命名和未命名信号量的用法

javascript - 将数据从网页传输到服务器c程序

c++ - 如何将 c 中变量的某些位复制到另一个变量?

c - 格式 '%s' 需要类型为 '*char' 的参数,但参数 2 的类型为 'int'

assembly - x86 AT&T 语法汇编的注释语法

assembly - 如何在 MASM 中为近乎直接的相对调用/jmp 编写绝对目标

linux - 了解 ASM 中的输入和输出

linux - 即使安装了 yasm 也找不到

c - 将编译代码与 NASM 和 MSVC 链接时 Unresolved reference