2012-11-12 3 views
2

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 
    } 

소스 : http://en.wikipedia.org/wiki/Insertion_sort

그것에 대해 내 지식은 아주 작은 내가하지 않습니다 무슨 일이 일어날 지 알기. 때로는 처음 몇 개의 숫자를 정렬하지만 나머지는 올바르게 정렬되지 않습니다.

+0

Linux syscalls를 사용하기 위해'int 80h '를 사용하지 말 것을 경고합니다. 요즘의 모든 최신 프로세서에는 특별한 syscall 명령이 있습니다. 코드를 이식성있게 유지하기 위해 Linux는 플랫폼이 올바른 syscall 명령을 실행할 syscall을 수행해야 할 때마다 호출 할 코드의 특별한 비트를 제공합니다. – Linuxios

+0

@Linuxios 주제에 대해 더 자세히 설명하겠습니까? 나는 그러한 권고를 전에 결코 우연히 발견하지 못했다. "요즘 모든 현대 프로세서"- x86/x86-64 아키텍처를 포함합니까? – zxcdw

+0

@zxcdw : 물론입니다. 이식성 문제는 Intel과 AMD가 서로 다른 지침을 사용한다는 것입니다. 따라서 Intel x86에서 AMD의 '시스템 센터 (sysenter)'인 동안 그것은 '시스템 콜 (syscall)'입니다. Linux는 응용 프로그램에 약간의 코드를 제공하여 사용자가 별도의 노력을 기울이지 않아도 올바른 지침을 사용하게됩니다. VDSO (가상 동적 공유 객체)라고합니다. – Linuxios

답변

3

당신은

cmp esi, [item] 

에 선

cmp esi, [array + 4*edx] 

을 변경하고 outerloop 전에 dec eax을 제거해야합니다. 그것은 작동해야합니다.

관련 문제