diff options
Diffstat (limited to 'assembly.lisp')
-rw-r--r-- | assembly.lisp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/assembly.lisp b/assembly.lisp index 1522643..e2b62f1 100644 --- a/assembly.lisp +++ b/assembly.lisp @@ -116,6 +116,30 @@ "cmovg rcx, rdx" "push rcx") +(defop bel () + "push bel") + +(defop oku () + "pop rax" + "xor rbx, rbx" + "mov bl, [rax]" + "push rbx") + +(defop yaz () + "pop rbx" + "pop rax" + "mov [rax], bl") + +(defop (syscall num) () + (iter (with call-regs = #("rdi" "rsi" "rdx" "r10" "r8" "r9")) + (initially (:write "pop rax")) + (for i from (- num 1) downto 0) + (:write ("pop ~a" (aref call-regs i))) + (finally (:write "syscall")))) + +(defun gen-header (op str) + (format str " ;; -- ~s --~%" op)) + (defun gen-code (op str) (let ((op-fn (gethash (car op) *operations*))) (if (null op-fn) |