diff options
Diffstat (limited to 'src/x86_64')
-rw-r--r-- | src/x86_64/postlude.asm | 8 | ||||
-rw-r--r-- | src/x86_64/prelude.asm | 56 |
2 files changed, 64 insertions, 0 deletions
diff --git a/src/x86_64/postlude.asm b/src/x86_64/postlude.asm new file mode 100644 index 0000000..139c4e1 --- /dev/null +++ b/src/x86_64/postlude.asm | |||
@@ -0,0 +1,8 @@ | |||
1 | ;; return the last value in the stack | ||
2 | pop rdi | ||
3 | call printdln | ||
4 | |||
5 | ; exit syscall | ||
6 | mov rax, 60 | ||
7 | xor rdi, rdi | ||
8 | syscall | ||
diff --git a/src/x86_64/prelude.asm b/src/x86_64/prelude.asm new file mode 100644 index 0000000..788b8e9 --- /dev/null +++ b/src/x86_64/prelude.asm | |||
@@ -0,0 +1,56 @@ | |||
1 | printdln: | ||
2 | sub rsp, 40 | ||
3 | mov BYTE [rsp+31], 10 | ||
4 | test rdi, rdi | ||
5 | jne .L2 | ||
6 | mov BYTE [rsp+30], 48 | ||
7 | mov eax, 30 | ||
8 | mov r8d, 2 | ||
9 | .L3: | ||
10 | lea rsi, [rsp+rax] | ||
11 | mov rdx, r8 | ||
12 | ;; write syscall (Linux) | ||
13 | mov rdi, 1 | ||
14 | mov rax, 1 | ||
15 | syscall | ||
16 | add rsp, 40 | ||
17 | ret | ||
18 | .L2: | ||
19 | mov r10d, 1 | ||
20 | js .L12 | ||
21 | .L4: | ||
22 | mov r8d, 1 | ||
23 | lea r9, [rsp+31] | ||
24 | mov rsi, -3689348814741910323 | ||
25 | .L5: | ||
26 | mov rax, rdi | ||
27 | mov rcx, r9 | ||
28 | mul rsi | ||
29 | sub rcx, r8 | ||
30 | shr rdx, 3 | ||
31 | lea rax, [rdx+rdx*4] | ||
32 | add rax, rax | ||
33 | sub rdi, rax | ||
34 | mov rax, r8 | ||
35 | add r8, 1 | ||
36 | add edi, 48 | ||
37 | mov BYTE [rcx], dil | ||
38 | mov rdi, rdx | ||
39 | test rdx, rdx | ||
40 | jne .L5 | ||
41 | cmp r10d, -1 | ||
42 | jne .L10 | ||
43 | not r8 | ||
44 | mov BYTE [rsp+32+r8], 45 | ||
45 | lea r8, [rax+2] | ||
46 | .L10: | ||
47 | mov eax, 32 | ||
48 | sub rax, r8 | ||
49 | jmp .L3 | ||
50 | .L12: | ||
51 | neg rdi | ||
52 | mov r10d, -1 | ||
53 | jmp .L4 | ||
54 | |||
55 | global _start | ||
56 | _start: | ||