c - C汇编实现冒泡排序
问题描述
我必须用汇编工具用 C 语言编写一个冒泡排序。我的 C 代码如下所示:
#include <stdio.h>
extern int arraysort(int array[],int length);
int main () {
int array[]= {7,4,3,6,2,1};
int length = 6;
printf("Unsorted array: %d,%d,%d,%d,%d,%d\n",array[0],array[1],array[2],array[3],array[4],array[5]);
arraysort(array,length);
printf("Sorted array: %d,%d,%d,%d,%d,%d\n",array[0],array[1],array[2],array[3],array[4],array[5]);
return 0;
}
我的汇编代码如下所示:
.intel_syntax noprefix
.text
.global arraysort
arraysort: # int sortarray(int array[],int length)
#function prologue
push ebp
mov ebp, esp
# function prologue end
push ebx # save ebx for cdecl convection
# 1.argumentum [ebp + 4*2] this is the array
# 2.argumentum [ebp + 4*3] this is the length
mov ecx, [ebp + 12] #array length (6)
dec ecx #array length (5)
mov edx, 1 #variable j
mov esi, [ebp + 8] #array address
loop1:
cmp ecx, 0 # (int i =length; i> length;i--)
jg end
loop2:
mov eax, [esi + 4*ecx] #array[0]
mov ebx, [esi + 4*edx] #array[1]
cmp eax, ebx #if eax > ebx jump to csere
jg swap
dec ecx #i--
inc edx#j++
jz end
jmp loop2
swap:
mov [esi + 4*edx], eax #change the two elements
mov [esi + 4*ecx], ebx
jmp loop2
end:
pop ebx
mov esp, ebp
pop ebp
ret
我不知道是什么问题,我为此苦苦挣扎。如果我将第一个循环 jg 更改为 jl,我会得到无限循环:/ 对不起我的英语和我的汇编编码技能,但我仍在学习这种语言。请帮我!谢谢
解决方案
这是主要问题:
mov ecx, [ebp + 12] #array length (6)
dec ecx #array length (5)
mov edx, 1 #variable j
mov esi, [ebp + 8] #array address
loop1:
cmp ecx, 0 # (int i =length; i> length;i--)
jg end
专注于ecx
那里。你基本上是在说if(--length > 0) goto end;
,所以你跳过了你的功能的全部内容。
现在一旦你解决了这个问题,你就会开始遇到段错误。原因如下:
dec ecx #i--
inc edx#j++
jz end
这相当于--i; if(!++j) goto end;
. 结果,您的循环将运行比您想要的更多的迭代(直到j
溢出,但实际上它会首先出现段错误)。我猜你的意思是切换dec ecx
and inc edx
,这样循环会在i
到达 0 时结束。
无论如何,也修复了该问题,您的代码将返回一个更新的数组,但它仍然是错误的。在这一点上,这只是因为你的冒泡排序是错误的,而不是因为任何与汇编相关的错误,所以我会在这里停下来。
推荐阅读
- javascript - 带有点符号的 MongoDB find() 不起作用
- python - GraphRbacManagementClient.applications.create() 返回访问令牌丢失或格式错误
- java - Android Studio 错误:按钮不止一次
- ruby-on-rails - Postgres db 无法在 Heroku 上运行
- font-awesome - 无法再下载 Font Awesome 4.7?
- audiokit - AKFFTTap 在 IOS 应用程序中不同步,如何解决?
- angularjs - IIS 缓存控制和 Angular JS
- javascript - javascript上的多个自动幻灯片问题
- c++ - 在c ++中解码大量以base64编码的数据
- python - 使用 python-shell 持续交换数据