diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/io.s | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/include/io.s b/include/io.s index 29a63c9..37f53b0 100644 --- a/include/io.s +++ b/include/io.s @@ -3,28 +3,28 @@ _io_s_file: # | int | -> cont -.thunkcode print +.thunkcode print_bin needs_alloc $040 - thunkto %rsi, $print_fini, $2, %rbp, %rsi + thunkto %rsi, $print_bin_fini, $2, %rbp, %rsi enter 020(%rbp) # arg -> | ret | cont | -.thunkcode print_fini +.thunkcode print_bin_fini needs_alloc $0110 #64 bit characters + 8 backup mov 010(%rsi), %rax # make a string mov %rsp, %r15 sub $1, %r15 - movb $0x0a, (%r15) - print_fini_loop: + movb $0x0a, (%r15) # newline at the end + _print_bin_fini_loop: mov %al, %bl and $1, %bl add $0x30, %bl sub $1, %r15 movb %bl, (%r15) shr $1, %rax - jnz print_fini_loop + jnz _print_fini_loop mov $1, %rdi #stdout mov %rsp, %rdx @@ -33,6 +33,43 @@ _io_s_file: mov $1, %rax #write syscall + mov 020(%rbp), %rsi # this is the original thunk which just got evaluated + movq $0, 010(%rsi) # it got evaluated to int 0 + movq $INT_code, 0(%rsi) + enter 030(%rbp) # the original continuation + +# | int | -> cont +.thunkcode print + # this is the same as above but decimal + needs_alloc $040 + thunkto %rsi, $print_fini, $2, %rbp, %rsi + enter 020(%rbp) + +# arg -> | ret | cont | +.thunkcode print_fini + needs_alloc $0110 + mov 010(%rsi), %rax + + mov %rsp, %r15 + sub $1, %r15 + movb $0x0a, (%r15) + mov $10, %rbx + _print_fini_loop: + mov $0, %rdx + div %rbx + add $0x30, %dl + sub $1, %r15 + movb %dl, (%r15) + test %rax, %rax + jnz _print_fini_loop + + mov $1, %rdi + mov %rsp, %rdx + sub %r15, %rdx + mov %r15, %rsi + mov $1, %rax + syscall + mov 020(%rbp), %rsi movq $0, 010(%rsi) movq $INT_code, 0(%rsi) |
