aboutsummaryrefslogtreecommitdiff
path: root/sort.asm
diff options
context:
space:
mode:
Diffstat (limited to 'sort.asm')
-rw-r--r--sort.asm33
1 files changed, 32 insertions, 1 deletions
diff --git a/sort.asm b/sort.asm
index d089dc9..9b3569b 100644
--- a/sort.asm
+++ b/sort.asm
@@ -24,7 +24,36 @@ end:
mov rdi, 0
syscall ; exit
+; this works sometimes (if numbers are good)
+; uses busy loop
+coolsleep:
+ mov rax, 0x4242424
+ mov rcx, rsi
+ mul rcx
+.loop:
+ dec rax
+ jnz .loop
+ ret
+
+; this works on most normal CPUs (if numbers are good)
+; uses nanosleep syscall
+boringsleep:
+ mov rax, 0x424242
+ mov rcx, rsi
+ mul rcx
+ push qword rax ; ns
+ push qword 0 ; s
+ mov rax, 0x23
+ mov rdi, rsp
+ xor rsi, rsi
+ syscall
+ add rsp, 16
+ ret
+
print:
+ push rsi
+ call boringsleep ; or coolsleep
+ pop rsi
mov rdi, format
xor rax, rax
call printf
@@ -32,7 +61,7 @@ print:
thread:
lea rax, print
- mov rsi, [array + (ecx - 1) * 4]
+ mov esi, [array + (ecx - 1) * 4]
call thread_run
ret
@@ -58,6 +87,8 @@ child:
;;; data
+section .data
+
array: dd 3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3
size: equ ($-array)/4
format: db "%d", 10, 0