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
그것에 대해 내 지식은 아주 작은 내가하지 않습니다 무슨 일이 일어날 지 알기. 때로는 처음 몇 개의 숫자를 정렬하지만 나머지는 올바르게 정렬되지 않습니다.
Linux syscalls를 사용하기 위해'int 80h '를 사용하지 말 것을 경고합니다. 요즘의 모든 최신 프로세서에는 특별한 syscall 명령이 있습니다. 코드를 이식성있게 유지하기 위해 Linux는 플랫폼이 올바른 syscall 명령을 실행할 syscall을 수행해야 할 때마다 호출 할 코드의 특별한 비트를 제공합니다. – Linuxios
@Linuxios 주제에 대해 더 자세히 설명하겠습니까? 나는 그러한 권고를 전에 결코 우연히 발견하지 못했다. "요즘 모든 현대 프로세서"- x86/x86-64 아키텍처를 포함합니까? – zxcdw
@zxcdw : 물론입니다. 이식성 문제는 Intel과 AMD가 서로 다른 지침을 사용한다는 것입니다. 따라서 Intel x86에서 AMD의 '시스템 센터 (sysenter)'인 동안 그것은 '시스템 콜 (syscall)'입니다. Linux는 응용 프로그램에 약간의 코드를 제공하여 사용자가 별도의 노력을 기울이지 않아도 올바른 지침을 사용하게됩니다. VDSO (가상 동적 공유 객체)라고합니다. – Linuxios