section .text printdln: sar rdi, FIXNUM_SHIFT 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 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 ret printbool: shr rdi, BOOL_SHIFT cmp rdi, 0 je print_false mov rsi, true_str ; addr mov rdx, 5 ; number of bytes jmp bool_write print_false: mov rsi, false_str ; addr mov rdx, 6 ; number of bytes bool_write: mov rax, 1 mov rdi, 1 syscall ret printstring: mov rsi, rdi mov rax, PTR_MASK and rsi, rax mov rdx, [rsi] add rsi, 8 mov rax, 1 mov rdi, 1 syscall ret printlambda: mov rsi, lambda_str mov rdx, [rsi] add rsi, 8 mov rax, 1 mov rdi, 1 syscall ret display: ;; is nil? mov rax, rdi cmp rax, NIL_VAL je display_end ;; is boolean? mov rax, rdi and rax, BOOL_MASK cmp rax, BOOL_TAG jne not_bool call printbool ret not_bool: ;; is string? mov rax, rdi and rax, STRING_MASK cmp rax, STRING_TAG jne not_string call printstring ret not_string: ;; is lambda? mov rax, rdi and rax, LAMBDA_MASK cmp rax, LAMBDA_TAG jne not_lambda call printlambda ret not_lambda: ;; is fixnum? mov rax, rdi and rax, FIXNUM_MASK cmp rax, FIXNUM_TAG jne display_end call printdln display_end: ret