Linux 汇编程序中的插入排序不';行不通

Linux 汇编程序中的插入排序不';行不通,linux,assembly,nasm,insertion-sort,Linux,Assembly,Nasm,Insertion Sort,我必须在NASM中做一些数字的插入。我有一个生成随机数的文件,并以二进制形式生成带有数字的输出文件。我的程序将其作为输入文件加载,并应给出使用插入排序(同样是二进制形式)排序的数字输出 我的代码: ; Template assembler source file section .text global _start _start: ; put your code here mov eax, 3 mov ebx, 0 mov ecx, array mo

我必须在NASM中做一些数字的插入。我有一个生成随机数的文件,并以二进制形式生成带有数字的输出文件。我的程序将其作为输入文件加载,并应给出使用插入排序(同样是二进制形式)排序的数字输出

我的代码:

; Template assembler source file

section .text
global _start

_start:
    ; put your code here
    mov eax, 3
    mov ebx, 0
    mov ecx, array
    mov edx, 4*32768
    int 80h
    mov [fileLength], eax   
    shr eax,2
    dec eax
    mov [number], eax



    mov ebx, 1 
    outerloop:
        mov ecx,[array + 4*ebx]
        mov [item],ecx 

        mov ecx,ebx 
        interloop:
        mov edx,ecx 
        dec edx
        mov esi, [array + 4*edx]
        cmp esi,[array + 4*ecx]     
        jb koniec 
            mov eax,[array + 4*edx]
            mov [array + 4*ecx],eax 
        loop interloop
        koniec:

    mov edx,[item]
    mov [array + 4*ecx],edx 

    inc ebx
    cmp ebx,[number] 
    jne outerloop


    mov eax, 4
    mov ebx, 1
    mov ecx, array
    mov edx, [fileLength]
    int 80h



    ; exit to linux
    mov eax,1
    mov ebx,0
    int 80h

; initialized data section
; use directives DB (byte), DW (word), DD (doubleword), DQ (quadword)
section .data

; uninitialized data section
; use directives RESB (byte), RESW (word), RESD (doubleword), RESQ (quadword)
section .bss
    fileLength resd 1   
    number resd 1   

    array resd 32768
    item resd 1
我用来编写插入排序的伪代码:

for i ← 1 to i ← length(A)-1
   {
     // A[ i ] is added in the sorted sequence A[0, .. i-1]
     // save A[i] to make a hole at index iHole
     item ← A[i]
     iHole ← i
     // keep moving the hole to next smaller index until A[iHole - 1] is <= item
     while iHole > 0 and A[iHole - 1] > item
       {
         // move hole to next smaller index
         A[iHole] ← A[iHole - 1]
         iHole ← iHole - 1
       }
     // put item in the hole
     A[iHole] ← item
   }
用于i← 一对一← 长度(A)-1
{
//在排序序列A[0,…i-1]中添加A[i]
//保存一个[i]以在索引iHole处生成一个孔
项目← A[i]
伊霍尔← 我
//继续将孔移动到下一个较小的索引,直到[iHole-1]为0且[iHole-1]>项
{
//将孔移动到下一个较小的索引
A[我的洞]← A[iHole-1]
伊霍尔← iHole-1
}
//把东西放进洞里
A[我的洞]← 项目
}
资料来源:


我对它的了解很少,不知道出了什么问题。它有时会对前几个数字进行排序,但其余数字的排序不正确。

您必须更改行

cmp esi, [array + 4*edx]


并在
外部循环之前删除
dec eax
。它应该可以工作。

只是警告您,您不应该再使用
int80h
来执行Linux系统调用。现在所有现代处理器都有特殊的系统调用指令。为了保持代码的可移植性,Linux为您的代码提供了一个特殊的代码位,以便在您需要执行系统调用时调用,该系统调用将执行平台正确的系统调用指令。@Linuxios介意详细介绍一下这个主题吗?我以前从未偶然发现过这样的建议。“现在所有的现代处理器”——包括x86/x86-64体系结构吗?@zxcdw:当然。可移植性的问题在于Intel和AMD使用不同的指令。因此,在英特尔x86上是
syscenter
,在AMD上是
syscall
。Linux为您的应用程序提供了一些代码,这些代码将使用正确的指令,而无需您付出任何额外的努力。它被称为VDSO(虚拟动态共享对象)。
cmp esi, [item]