Sorting algorithms/Sleep sort: Difference between revisions

Content added Content deleted
No edit summary
(Added assembly implementation)
Line 33: Line 33:
sleepsort←{{r}⎕TSYNC{r,←⊃⍵,⎕DL ⍵}&¨⍵,r←⍬}
sleepsort←{{r}⎕TSYNC{r,←⊃⍵,⎕DL ⍵}&¨⍵,r←⍬}
</syntaxhighlight>
</syntaxhighlight>

=={{header|Assembly}}==
{{works with|flat assembler for 64-bit Linux}}
<syntaxhighlight lang="asm">
format ELF64 executable 3
entry start

start:
mov r12, [rsp] ; get argc
mov r13, 1 ; skip argv[0]

.getargv:
cmp r13, r12 ; check completion of args
je .wait
mov rdi, [rsp+8+8*r13] ; get argv[n]
inc r13

mov rax, 57 ; sys_fork
syscall

cmp rax, 0 ; continue loop in main process
jnz .getargv

push rdi ; save pointer to sort item text

call atoi_simple ; convert text to integer
test rax, rax ; throw out bad input
js .done

sub rsp, 16 ; stack space for timespec
mov [rsp], rax ; seconds
mov qword [rsp+8], 0 ; nanoseconds

lea rdi, [rsp]
xor rsi, rsi
mov rax, 35 ; sys_nanosleep
syscall

add rsp, 16

pop rdi ; retrieve item text
call strlen_simple

mov rsi, rdi
mov byte [rsi+rax], ' '
mov rdi, 1
mov rdx, rax
inc rdx
mov rax, 1 ; sys_write
syscall

jmp .done

.wait:
dec r12 ; wait for each child process
jz .done
mov rdi, 0 ; any pid
mov rsi, 0
mov rdx, 0
mov r10, 4 ; that has terminated
mov rax, 247 ; sys_waitid
syscall

jmp .wait

.done:
xor rdi, rdi
mov rax, 60 ; sys_exit
syscall

atoi_simple:
push rdi
push rsi

xor rax, rax

.convert:
movzx rsi, byte [rdi]
test rsi, rsi ; check for null
jz .done

cmp rsi, '0'
jl .baddigit
cmp rsi, '9'
jg .baddigit
sub rsi, 48 ; get ascii code for digit

imul rax, 10 ; radix 10
add rax, rsi ; add current digit to total

inc rdi
jmp .convert

.baddigit:
mov rax, -1 ; return error code on failed conversion

.done:
pop rsi
pop rdi
ret ; return integer value

strlen_simple:
xor rax, rax

.compare:
cmp byte [rdi+rax], 0
je .done
inc rax
jmp .compare

.done:
ret
</syntaxhighlight>
{{out}}
<pre>
./sleepsort 35 21 11 1 2 27 32 7 42 20 50 42 25 41 43 14 46 20 30 8
1 2 7 8 11 14 20 20 21 25 27 30 32 35 41 42 42 43 46 50
</pre>


=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==