我正在用汇编语言(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/