From 7418a5042471a3a7f05283d36e45b6b422d9785b Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 1 Nov 2021 14:30:30 +0100 Subject: Add x86_64 compilation for arithmetic expressions --- src/x86_64/postlude.asm | 8 +++++++ src/x86_64/prelude.asm | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/x86_64/postlude.asm create mode 100644 src/x86_64/prelude.asm (limited to 'src/x86_64') 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 @@ + ;; return the last value in the stack + pop rdi + call printdln + + ; exit syscall + mov rax, 60 + xor rdi, rdi + 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 @@ +printdln: + sub rsp, 40 + mov BYTE [rsp+31], 10 + test rdi, rdi + jne .L2 + mov BYTE [rsp+30], 48 + mov eax, 30 + mov r8d, 2 +.L3: + lea rsi, [rsp+rax] + mov rdx, r8 + ;; write syscall (Linux) + mov rdi, 1 + mov rax, 1 + syscall + add rsp, 40 + ret +.L2: + mov r10d, 1 + js .L12 +.L4: + mov r8d, 1 + lea r9, [rsp+31] + mov rsi, -3689348814741910323 +.L5: + mov rax, rdi + mov rcx, r9 + mul rsi + sub rcx, r8 + shr rdx, 3 + lea rax, [rdx+rdx*4] + add rax, rax + sub rdi, rax + mov rax, r8 + add r8, 1 + add edi, 48 + mov BYTE [rcx], dil + mov rdi, rdx + test rdx, rdx + jne .L5 + cmp r10d, -1 + jne .L10 + not r8 + mov BYTE [rsp+32+r8], 45 + lea r8, [rax+2] +.L10: + mov eax, 32 + sub rax, r8 + jmp .L3 +.L12: + neg rdi + mov r10d, -1 + jmp .L4 + +global _start +_start: -- cgit v1.2.1