From 002b36f89cb6df991673febd20b4c71c27bbe259 Mon Sep 17 00:00:00 2001 From: IgorCielniak Date: Fri, 19 Dec 2025 20:23:26 +0100 Subject: [PATCH] updates to io.sl --- a.sl | 2 +- build/a.asm | 596 ------------------- build/a.o | Bin 5440 -> 0 bytes build/call_syntax_parens.asm | 621 -------------------- build/call_syntax_parens.o | Bin 5504 -> 0 bytes build/debug_addresses.asm | 521 ----------------- build/debug_addresses.o | Bin 5168 -> 0 bytes build/hello.asm | 596 ------------------- build/hello.o | Bin 5456 -> 0 bytes build/loops_and_cmp.asm | 630 -------------------- build/loops_and_cmp.o | Bin 5568 -> 0 bytes build/main.asm | 621 -------------------- build/main.o | Bin 5488 -> 0 bytes build/override_dup_compile_time.asm | 594 ------------------- build/override_dup_compile_time.o | Bin 5376 -> 0 bytes build/str.asm | 565 ------------------ build/str.o | Bin 5248 -> 0 bytes build/string_puts.asm | 617 -------------------- build/string_puts.o | Bin 5712 -> 0 bytes build/t.asm | 409 ------------- build/t.o | Bin 4128 -> 0 bytes build/test.asm | 866 ---------------------------- build/test.o | Bin 7472 -> 0 bytes build/test_read_file.asm | 592 ------------------- build/test_read_file.o | Bin 5744 -> 0 bytes build/test_read_stdin.asm | 616 -------------------- build/test_read_stdin.o | Bin 5584 -> 0 bytes build/test_write_buf.asm | 555 ------------------ build/test_write_buf.o | Bin 5088 -> 0 bytes build/test_write_file.asm | 593 ------------------- build/test_write_file.o | Bin 5616 -> 0 bytes main.sl | 4 +- stdlib/io.sl | 126 +++- str.sl | 8 - t.sl | 4 +- test.sl | 72 +-- test_read_file.sl | 9 +- test_read_stdin.sl | 2 +- test_write_file.sl | 12 +- tests/run_tests.py | 12 +- 40 files changed, 152 insertions(+), 9091 deletions(-) delete mode 100644 build/a.asm delete mode 100644 build/a.o delete mode 100644 build/call_syntax_parens.asm delete mode 100644 build/call_syntax_parens.o delete mode 100644 build/debug_addresses.asm delete mode 100644 build/debug_addresses.o delete mode 100644 build/hello.asm delete mode 100644 build/hello.o delete mode 100644 build/loops_and_cmp.asm delete mode 100644 build/loops_and_cmp.o delete mode 100644 build/main.asm delete mode 100644 build/main.o delete mode 100644 build/override_dup_compile_time.asm delete mode 100644 build/override_dup_compile_time.o delete mode 100644 build/str.asm delete mode 100644 build/str.o delete mode 100644 build/string_puts.asm delete mode 100644 build/string_puts.o delete mode 100644 build/t.asm delete mode 100644 build/t.o delete mode 100644 build/test.asm delete mode 100644 build/test.o delete mode 100644 build/test_read_file.asm delete mode 100644 build/test_read_file.o delete mode 100644 build/test_read_stdin.asm delete mode 100644 build/test_read_stdin.o delete mode 100644 build/test_write_buf.asm delete mode 100644 build/test_write_buf.o delete mode 100644 build/test_write_file.asm delete mode 100644 build/test_write_file.o delete mode 100644 str.sl diff --git a/a.sl b/a.sl index abb8f27..3a30680 100644 --- a/a.sl +++ b/a.sl @@ -4,4 +4,4 @@ import stdlib/io.sl : main "hello world" puts ; -compile-time main \ No newline at end of file +compile-time main diff --git a/build/a.asm b/build/a.asm deleted file mode 100644 index 9b91637..0000000 --- a/build/a.asm +++ /dev/null @@ -1,596 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_read_stdin: - ; stack: max_len - mov r14, [r12] ; max_len - add r12, 8 ; pop max_len - - ; mmap(NULL, max_len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - mov rsi, r14 ; length - mov rdx, 3 ; PROT_READ|PROT_WRITE - mov r10, 34 ; MAP_PRIVATE|MAP_ANONYMOUS - mov r8, -1 ; fd = -1 - xor r9, r9 ; offset = 0 - syscall - cmp rax, -4095 - jae .fail_mmap - mov rbx, rax ; buffer addr - xor r9, r9 ; bytes_read = 0 - -.read_loop: - mov rax, 0 ; syscall: read - mov rdi, 0 ; fd = stdin - lea rsi, [rbx + r9] ; buf + offset - mov rdx, r14 - sub rdx, r9 ; remaining = max_len - bytes_read - syscall - cmp rax, 0 - je .done_read - js .read_error - add r9, rax - jl .read_loop - -.done_read: - ; push len (rcx) then addr (rbx) - cmp r9, r14 - je .done_no_null - mov byte [rbx + r9], 0 -.done_no_null: - sub r12, 16 - mov [r12], r9 - mov [r12 + 8], rbx - ret - -.read_error: - ; return negative errno in rax, addr = 0 - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], 0 - ret - -.fail_mmap: - sub r12, 16 - mov qword [r12], -1 - mov qword [r12 + 8], 0 - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 11 - sub r12, 8 - mov qword [r12], 11 - call word_puts - ret -section .data -data_start: -str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0 -str_0_len equ 11 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/a.o b/build/a.o deleted file mode 100644 index 9dda115f3cf0a5375299341caa6e030c4dd5a1ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5440 zcmbW5eQXp}5WwHj77InLDlv_g1k7n5(X$^It%7MA&|R}i|R9oRl{^fM;p^Ir|RJSTv}&@#LWF(&Uq)W8$R^7)P7 zD^Vln{%8zegRP&k;OdBEZD*ZYy-*#|^Aok2J2kQvXt)N67Tzy(w>nZRdUCzc7};5c z{S89T|5_WAQV-35e0`+0tRP1h?g!#FMsycM%AiCABT}!sOBC1L`y=(UggD5+(d#`S z%ps@tEt4~7AgCy(kTNjhISek&nxwEX(xBYfNCwbUgN&qJ2Qv+7c+dR@N)YH(cw90yX&>T}x6nfd6lfF;Pa)>eEU7b(1_h`IA;3Cf;5kL<*?B(;w zUh-vHK@~_jdi2YMR6z}B?sr=L#7Vs{7+IwkoX83ta~y+PeGJPZR)9s%Pc)6-9tziJ z?nHTkAkHYg|$I|Ev)?y1LX}JpfVa<;g8F4_;CFv{(h0cK^nlqMEwXJE1El_ zHJ{d+r(xf@2etfPBE0KK;JQ0Df?L^er$9c6s;E&!jlm6?J1KLgHJ3(l(|1UPm^&70 zK8*P+#@rJlc(A~5=x;w0I$0`ZJHb2HaFAc9@7kiTV7SMW2#$g&Sf3JHMZ^890-i&t zO^u?dx_oMs4PZ=@zgE4gK?)V7$Zn&Qs?m5H# zS!O`b|1AbDA=f?y1Uon8!rqtzp-e7RF-Aq>CB<-0k7D>8qgTLPS5B+ktdps@3v<+b zSRR81KtY+bI0#s|NSwViTmIwz~^a24xg^0>n6RipqdC^A(Y zkqN>yN~#JF42A@%ogOvmVAxT8X@PAeUqT-cOM!wp*iyL@IxLs7NGe|gc(QuwVt53+agXTkDZ@P~U0DWI z;8201`xFBd2(A{S2fgsxxW9io4wY3zDzDz8Wo1?jWNa&;K-5WYbwo4~cj6-2mCcH1 zwm0k8PP_|RkM^l2_3fk;SNdda{s;P2El!o@(x{sA3k%=lxDRJvRdc-I)$2JVRx$O} zvL6yHjJFbRXM7#;I~c!}_=Aiqy^z?<_GLgWW@~pqn)KUV7ECV*eSKbZeYteGjp?%njlTMo0 z4|o`mKuxA|mNiQ#EhKH*OK-rUbl4BAKj&lx-k{iRGo2i;QZQpCZ9S@Jznw}uCj6;x zyoXA4Pn*Q!*n1^wj$~wiEVY&;$C6?2xpnB~ux3a-wfXXqS9eH?oh se-6R*JmcQ~sXh#Fw11|g?0m`iS>g-n{Pp}9qz|Os#PMA9e1@j@7XsZd&Hw-a diff --git a/build/call_syntax_parens.asm b/build/call_syntax_parens.asm deleted file mode 100644 index 1c290da..0000000 --- a/build/call_syntax_parens.asm +++ /dev/null @@ -1,621 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_read_stdin: - ; stack: max_len - mov r14, [r12] ; max_len - add r12, 8 ; pop max_len - - ; mmap(NULL, max_len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - mov rsi, r14 ; length - mov rdx, 3 ; PROT_READ|PROT_WRITE - mov r10, 34 ; MAP_PRIVATE|MAP_ANONYMOUS - mov r8, -1 ; fd = -1 - xor r9, r9 ; offset = 0 - syscall - cmp rax, -4095 - jae .fail_mmap - mov rbx, rax ; buffer addr - xor r9, r9 ; bytes_read = 0 - -.read_loop: - mov rax, 0 ; syscall: read - mov rdi, 0 ; fd = stdin - lea rsi, [rbx + r9] ; buf + offset - mov rdx, r14 - sub rdx, r9 ; remaining = max_len - bytes_read - syscall - cmp rax, 0 - je .done_read - js .read_error - add r9, rax - jl .read_loop - -.done_read: - ; push len (rcx) then addr (rbx) - cmp r9, r14 - je .done_no_null - mov byte [rbx + r9], 0 -.done_no_null: - sub r12, 16 - mov [r12], r9 - mov [r12 + 8], rbx - ret - -.read_error: - ; return negative errno in rax, addr = 0 - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], 0 - ret - -.fail_mmap: - sub r12, 16 - mov qword [r12], -1 - mov qword [r12 + 8], 0 - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push 2 - sub r12, 8 - mov qword [r12], 2 - ; push 40 - sub r12, 8 - mov qword [r12], 40 - call word__2b - call word_puts - ; push 1 - sub r12, 8 - mov qword [r12], 1 - ; push 2 - sub r12, 8 - mov qword [r12], 2 - call word_foo - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -word_foo: - call word__3er - call word__3er - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_rpick - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word_rpick - call word__2b - call word_rdrop - call word_rdrop - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/call_syntax_parens.o b/build/call_syntax_parens.o deleted file mode 100644 index aed5fd1d58f3f3315dacb2e656ae1e8d72090408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5504 zcmbW4Z)_A*5WwHr7Fw!aqeO`*2F+<8!IQQSt)giOm|fg67%=()T(-R{oL=wh?w*CD zDp*Na&wenXMkD_DU^LMvCPr&D(sHE*K}0?%k!Vb;vGGp=#!w^ZIrHA^?cTJ-#7%B@ z-f!m3n>TOX+r7uu7ubo7~fpS05y5UmjJJY-)#MN2nvMy^YJg6p)Z>HoDP zB)p%Dfg4bobRg70$y(35wR)jCruUE5YTo$ZN}$miBwF+Xp?lS_V$s*@g~r(KDr~P2 zdjGGrVJ)@L4d_?LYRd+)cVQzCuQ8^3pi&McDj2Z_-Md(E-P;&zn5M)|2KHX!%KgLCh?kQsKf>FY{XD^_8=>ob}E}(n)0=m6{ zPAjMaDbF6`@*q`E1Df}})<1DtFZ9J0>jgKqNXHx};MS19@<;F?kpL!g)?hOy(RyMqG&<~+0S`^WuZ;j@S$=qp8r6Jt(?b0CO4JVoo zV?K)sZ(fu3&S91AjSOP!hWCZx{bP7P z%M9rKe~G@!DYP#D!Ol&1us3EvsFMp-Oi$Lpc5Rp=;r;tDseGZj-54k2z{O zERVtcU?SEIEU!1b-;E`osrcNv+ZO7Pk-l#et!LbtRb$olxQY!4d0b)kDpG(R6dA9M z$pm2uz1%j&u>A_O=<;5URzWZ0HH2D>jmrt>qFQfG&zQZTq4_QE46el;HhmQBc z%{N9o`FIGRr^$!VY%LCwKuLpJ5iRM8yQyuih$k)A67del5pid$+Y?>*}ihprZ9N;4T$&G-d}-w8O~=~vYZUl8)G4t_9&;p-OJh=}Ge1bH>_HpcHF zzK-$xh~Lk+Mf^d=RXZYj7|)aaql`aB{AtE_6Mu*CJ;aYNzL)q(#@`_R2jlM%zZ4fJ zbbTV_h`5~bapJcyeuDTtjGrRj!T1F69OJ(c-@*7<;?FUz3MwMrX1rduBjOO_R}!CK zd=YV8a!ZIevQk_@{AR}6iEm(hE%D8auP5#@zKQrg#?!uzLf*>%=XmTbPb(*)Bce*_@f$mUhjDtxP^8dUJNt>@=4z^QGn{CD~<` z%=ajiv~wio9!}YcIlUG!JLf87HiIF_*)(b0eCLBo-CXvEcBF0&{4@v7&E}4>OJA^j zq01LmkkFDeTarF(3gnhf-+-oTwseNHsX+F#VEReu?)GQbozIqKOrLUTWof`1r6cQ4 z+-&hPWP_-z?O?t=X+IryNK9Etvn!qP&HZM)Gm~>tW|x)Dm>DOPqD0zdz0~A-Qdt_O zQV~p|*G{|Or#wQ?j!PG^t$c75^X|CGba*t`j?0KLIe$@QQ)!a9Y|6xTD8i5iYBHP8 zWTq*lhm>vm=?!_50S8m-$-9og8x*^3W>dYHG>n+bX0|KZW2dvO2|v}eI>nL>`G_T&Q_DmBv(7c3XZXx^g*zU&OTEq?m#VNy7ev^)!Fb2o!e-Sec|g}UN6qV4~97UKUY$I TzGnP9@i}y^`tkI!52AkoOQCSO diff --git a/build/debug_addresses.asm b/build/debug_addresses.asm deleted file mode 100644 index baf9c7f..0000000 --- a/build/debug_addresses.asm +++ /dev/null @@ -1,521 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_strlen: - mov rax, [r12] ; addr - mov rcx, [r12 + 8] ; len - add r12, 16 ; pop len and addr - mov [r12], rcx ; push len - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel print_buf_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge .print_abs - neg rbx - mov r8, 1 -.print_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne .print_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp .print_sign -.print_digits: -.print_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne .print_loop -.print_sign: - cmp r8, 0 - je .print_finish - dec rsi - mov byte [rsi], '-' - inc rcx -.print_finish: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret - ret -word_push_data_start: - lea rax, [rel data_start] - sub r12, 8 - mov [r12], rax - ret - ret -word_push_print_buf_addr: - lea rax, [rel print_buf] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_mkstr: - mov rax, [r12] ; ptr - mov rbx, [r12 + 8] ; len - mov [r12], rbx ; top = len - mov [r12 + 8], rax ; next = ptr - ret - ret -word_mkstr_copy: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr (source) - add r12, 16 ; pop len+addr - - ; compute cap = PRINT_BUF_BYTES - 1 (leave room for newline or NUL) - lea rdi, [rel print_buf] - mov rcx, 127 ; PRINT_BUF_BYTES-1 (PRINT_BUF_BYTES=128) - cmp rdx, rcx - cmova rdx, rcx ; rdx = min(len, cap) - - ; copy rdx bytes from rsi -> rdi using rep movsb - test rdx, rdx - jz .done_copy - ; save callee-saved r14, use it to hold base dest pointer - push r14 - mov r14, rdi ; r14 = base dest (print_buf) - mov rcx, rdx ; counter = copied length - cld - rep movsb - mov rbx, r14 ; move saved base into rbx for return - pop r14 ; restore original r14 - -.done_copy: - ; push copied length and pointer to print_buf (use saved rbx) - sub r12, 8 - mov [r12], rdx ; len - sub r12, 8 - mov [r12], rbx ; addr -> print_buf base - ret - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_main: - call word_push_print_buf_addr - call word_print_int - call word_push_data_start - call word_print_int - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/debug_addresses.o b/build/debug_addresses.o deleted file mode 100644 index b9fa9302dab1e8aa35e51110b18d1f3c76ce07c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5168 zcmd6reQXp(6u{?bD_20SD#051M=_^CgtJ^h(txH-sO-jTLL!)GNSABxD3`W(b#IT- zqFQAImzw5 z`Mr;M^JZpu+nvp^CuRf!!f65VxbS)o6{67-Np2KDQSPJvO~kSAcL#HCoT0#IMX{o) zxGQEtAN|W1uMILlU7qosz|nLn|6PI-A%8yp-6ed{)ER#z`8hXU+Zs?5kDx3!QU0|! zL1^8(tIitGx%WFdjMJGN8!Ej}1M5W-azF zv7x0XU3n8shb3#6u!4HNJgg6l1U382@M@r;3M5+S6QSGX;X=XD>-n1S-ZJbr3w_{f z(5KDE!a)d8rQ35Hhy2EHP#gGL^gk6Fk{cv8gbOKR4Tb*3Si_gwS84Vs&He%1w82qp z&M@Zw8D2sar=`a%4{1Xy(D|5ByD4dQp-E0e8yFYcE48spP11+VkD^c0u~~3MgWPOw z^1|sm>a@v|ztw2VMm76;eeBO&rvO~oJ0B>7(*`f)F6)rDRVj^^0zO?ncNW}y+1O`w z`+Cg25UTh;rBcvTrM<TbU>-H_pzBqB?P|Uv3)T#ynM>$xHe-G)f zx8%N(L+bX%aFuUdrNn%22SQS$g!JY1l=GDt(ljuD-_X-R5O=DuC;1@x_2FvV-nzY> z0$`|WFoQv{F4a!*UKl!9dH{}*%mmYV$ln=T0s$q!;X#Wh?|?QoJ{6tkiv;IUYbYGY z3WxR;a9O-j{JQhcc#(3?di0Klf{z)6S{D+?J4==)P zSgT`=Ti{aFf;+Dz57izRsT;1u307$Kh+A2h=W?po>hSPvsi%sqmYg1B#q}6G5!!bW z4tQwaDR{bl0l!gg;YIn(D$1{vU8QHIq5cGTpP(Vt<5M5F1{hPpaWFS z23Po;I}Z=8IqyAFuQX3gPF^`U4wuC!9RNwXoGHh5i74R3*CJMOn>g!f_>YK@~xU%;JC@tc%wp?7FETt`zZ<^aRWhLK~`2J%rIdHvSx(CD} z7Dl~~10u?J6WKR1j_+K2^Q~ii1MybI1g7d}1KV|l7h@WG86Y*ae&k-MI z{3YUZ*hkfC#P4JL1LDgW|B!eCb92g5wd@l@vn%d8UK;^LB{_feuVKEvL6tm zjL#+hJLC5fpJ03;@oIKt9wr`T{88d78E+!q%6N=;ALAQ{?_s=^_^XU}5I@9t5AkD+ z_Ywb^@j>EO8GnU%kbV5VK|IX3TBm?$Wc)DMZ)E&9@okKc5PzQW^Tc0g{5#^`GX691 ztBhYGKEe1+;$ivmD-W%_+#()he5R~dKp2eQMZAac1;lqV{vh!^jMovzzZU#$74eT4 zZo*tcrr^&=E-yv)n_Mmrnyc%af}1Wc9((%~`~~9t@5Ti%QWZQmZfkA1R9E7W zM6xZ{VZ;*&GnvgMvyphVTNqg@Zd!DUq%%fxTgo!F#=CM!(VH<7M!T`R&XJxD!auXGnteZs<<0b3JhIRQ8ETO$)QVnWigeK8kL$eeM}O*V5p?ZAqP+;)t1{V zYp<*mxgI6-nkg%3fReZg1(2?ptw~c!+1@y@?oKGJf>JcvGd+F0A4z1O?w-cXSjxnR zCR{n4qL5auy;G^9Zcb=N>Zmt()XT_-wz(l4A?^q?6C=8UNPWVnPdM6To?PGV7|>ob z>f3$Vq$fLD&~SEOceh)TT-ud!@2ZgTG!2-ca;4oO)H`K0jd~i_^yb@>a>`+PVs|{1 z7QUsGViJZ(!07>dbu%m|nyHAoN#d@)a3uqMeN7%`=;P_fN9qK9vC4lp6mfO72Y_Ki zd-R1*Y}sB!2+fJpPv5df6n6Req>6Kf@d@HL8F%9Brbi2pf6d4J`P}kxH7^BrU;t=N K9A{ibh4>dq@85a= diff --git a/build/hello.asm b/build/hello.asm deleted file mode 100644 index 9b91637..0000000 --- a/build/hello.asm +++ /dev/null @@ -1,596 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_read_stdin: - ; stack: max_len - mov r14, [r12] ; max_len - add r12, 8 ; pop max_len - - ; mmap(NULL, max_len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - mov rsi, r14 ; length - mov rdx, 3 ; PROT_READ|PROT_WRITE - mov r10, 34 ; MAP_PRIVATE|MAP_ANONYMOUS - mov r8, -1 ; fd = -1 - xor r9, r9 ; offset = 0 - syscall - cmp rax, -4095 - jae .fail_mmap - mov rbx, rax ; buffer addr - xor r9, r9 ; bytes_read = 0 - -.read_loop: - mov rax, 0 ; syscall: read - mov rdi, 0 ; fd = stdin - lea rsi, [rbx + r9] ; buf + offset - mov rdx, r14 - sub rdx, r9 ; remaining = max_len - bytes_read - syscall - cmp rax, 0 - je .done_read - js .read_error - add r9, rax - jl .read_loop - -.done_read: - ; push len (rcx) then addr (rbx) - cmp r9, r14 - je .done_no_null - mov byte [rbx + r9], 0 -.done_no_null: - sub r12, 16 - mov [r12], r9 - mov [r12 + 8], rbx - ret - -.read_error: - ; return negative errno in rax, addr = 0 - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], 0 - ret - -.fail_mmap: - sub r12, 16 - mov qword [r12], -1 - mov qword [r12 + 8], 0 - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 11 - sub r12, 8 - mov qword [r12], 11 - call word_puts - ret -section .data -data_start: -str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0 -str_0_len equ 11 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/hello.o b/build/hello.o deleted file mode 100644 index 2a1766a33e8d7a8df616c4c7c4235002cbc8fc26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5456 zcmbW4e`p+a7Qnx2k~aOJyQlRi60yoE6?AQW$QiAYlvZYRR(e=Lv^s9G8?$w?8)j!s z#i-R-bX@&wTKpqB3L=kAJ7&tVq@3$-uKPU zh6XPSK|<&)g+7jN5d2uP1}g=Z9-j$vRF&h^GCgpIVn^7Hod4{F#-c8d{}Yc39x}Hr zAecLY*6iZ({TLuzn1-9+$6=|}2;oY?Z=UbKUS&r=7D74yWuPl_0!Tf*3hzoy&|Rq} zc;Z+&zcqR>YNY-DS)-R@>+2G@I!3H>)@wE^jY)H4vf1#b$JPUlHz6_NuPf7UOjfIb z+^n=DA8)|^CS{I%*Bq5{56yslW3sufK%*;Lf%q*+(+80@NT^~Z6Q;jXbJO3NOw1GF zAPYxt41_QTO&wZhXV5@Yk)|LS7zrE(7w1h<*^*qX-Ppng(9~**Bw>P?)p~f;3@6Qu zL5j!|bnDV+XXY|+odAvlDQ5Mr#>~mZ=&Fb%$hFZ~eG?ZczN?D43ulSSo;!`~Z>N#% zK8@_f)5!iF%8ZIGkb3m!mk+6e8Zi7XjFF?q%*t?bty%GsYfQ{>8g7X+mPfh*i#{^B zZVdNOyvgt<>k9;Nc5uGdC&yOkg4B6jPn?T%Za#KS#CPp6b{>iE+6$F?0Dgyz3qQg| z{cXKvp`L+uCSdeLSYo(zBi}<|ZBk$hYkyy)yrBb>qQMn@uO3GTH@+Y47YYv202U?_ zV|c6>{*2N3qtSW@_MN}i82L%XpL_(k=}(N|R<`_UkdLD(YE)5Uc$48zQSOY^+Bk0d zZc<456Y16in9pk3KRSj73k-+;!zW|MYPHe^@D4T{Cr~&?@Cync3t$&ROT((eGCR0!Cf7iGZ*_zBEmXJ!9y* z<$qxLr!4;)%78iYvl>2!UHbqK?A){udt(8FGFqr=nu{h#isk<}j^THYUj%nkJFRnb zEv4dS%u(wBItJec6?MaC#|q0oVO{!;_Rm|o{d_aFXZW*p=W(xT!&Ku6T*XA1jw{UG zoD`r1O{N=@lpstaQC)y|7*W_aTcdbVD{B;AY|84a4tH6d?>=yi0juwSj&)(|JmjsU z)Vz)Pi8oErh~*(NMz6%dwDj>NJp;ZIK?$XMc2t{kn(cdJ(bF4 zyo^fqlu9a9>Mwb&m+67leFOT*eK+T1v_4x~{DHnTs^hhVG#VEC!ov4B?!)<4!vb%3 z{r-=swL+cV!C=2laQz(;Q(c00Q$MCQ3w|T>I|bju{2sxzUQ7)N-p~3E3hpw0M)3QY z|4Z=4n7=Fd)65SG{sQwK1b>P7S-3!v>)+IlsdEG$XMVNd`sx~FVt$9n}!Ea;!mEhZ$pHD9jDn7bB%DhYP z7n$E6_?ygc75o$C+XO$x{9(a=W?mIMLHUiTF9pAVd4u?Wsp})AE)l$g^(DWK`39kH zF#ogQw=*vYzKyvrxJR6V3zH13hZf;Gi65`wt1o&z#rpF9@L!12Evl||*EtnfUG~Z% z{6BR**Vq3p!l#(a|JQ$jnG%b#3Uz8kwNc7c{QqMtjz7&jzqHY`6CY3LLK8-W!qT!gi1aJ4nL7 zKoH$PxlnIo`n1VRfhR0-ItoGHc6*Q^7n)kz4dWfm2kCGl&0HpH_vM{HJ?N%-onk3x z_hs^q?UZskPNZ9xlcYG9EATvX1z`|FZr%es^%=r`icC;n+mIq*z2s%{(b=e#3DHyhBjFCN(ygK?5rMW?2x%mp}*flT1HF>f=R zf1RSc?ZA?dC49{t{=7sS#mYe4b&15q#y$@)tDyoteY+ zx%4cb>!^=oXYub5TrUVt|CT_$FT&CO$(pwFso=BBm+*NU_%qBOOwTaKb2ji9n(9~Q C)ib>S diff --git a/build/loops_and_cmp.asm b/build/loops_and_cmp.asm deleted file mode 100644 index 03068e5..0000000 --- a/build/loops_and_cmp.asm +++ /dev/null @@ -1,630 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_read_stdin: - ; stack: max_len - mov r14, [r12] ; max_len - add r12, 8 ; pop max_len - - ; mmap(NULL, max_len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - mov rsi, r14 ; length - mov rdx, 3 ; PROT_READ|PROT_WRITE - mov r10, 34 ; MAP_PRIVATE|MAP_ANONYMOUS - mov r8, -1 ; fd = -1 - xor r9, r9 ; offset = 0 - syscall - cmp rax, -4095 - jae .fail_mmap - mov rbx, rax ; buffer addr - xor r9, r9 ; bytes_read = 0 - -.read_loop: - mov rax, 0 ; syscall: read - mov rdi, 0 ; fd = stdin - lea rsi, [rbx + r9] ; buf + offset - mov rdx, r14 - sub rdx, r9 ; remaining = max_len - bytes_read - syscall - cmp rax, 0 - je .done_read - js .read_error - add r9, rax - jl .read_loop - -.done_read: - ; push len (rcx) then addr (rbx) - cmp r9, r14 - je .done_no_null - mov byte [rbx + r9], 0 -.done_no_null: - sub r12, 16 - mov [r12], r9 - mov [r12 + 8], rbx - ret - -.read_error: - ; return negative errno in rax, addr = 0 - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], 0 - ret - -.fail_mmap: - sub r12, 16 - mov qword [r12], -1 - mov qword [r12 + 8], 0 - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - mov rax, [r12] - add r12, 8 - cmp rax, 0 - jle L_for_end_1 - sub r13, 8 - mov [r13], rax -L_for_loop_0: - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word__2b - mov rax, [r13] - dec rax - mov [r13], rax - jg L_for_loop_0 - add r13, 8 -L_for_end_1: - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3d_3d - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 4 - sub r12, 8 - mov qword [r12], 4 - call word__3d_3d - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/loops_and_cmp.o b/build/loops_and_cmp.o deleted file mode 100644 index 202d3d53788f1e1377ea9a41a2b7b89f1d650048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5568 zcmbW4YiJx*6oBtGNljaI*C$a^sIqDmyXH~RXw;-MG9$A^X$5~&$KCA4u5Nah*;!L1 z+SaAeVGW{IQSpU>4-jep)EGt6Y)o2ftM-RhiVw76@BvoDNLyXcx%bS@>}fWF1G{tY zcOLiLbI-jqv#HOxX+a<$+$$h%5MIxvLiBh|YWIj{(deW9uZd&fZy_`9S)jm`r_>5U zwOxT?v~OTMw}=7i@`z6Z-VDEb_L~I-LiT+8Gv}~HRd@WW$gx#!{8pC>VvRQMcN4tRrn~-S1T|##n!{xFo*GsM8Z4KD(6MFHN zX1|nr=mzAg!_8F%XD$|0l-oVWo)h$jtFS{H6nVXPwu=&D7|B&36z7G>^tLrK#EkRllghIN_0GkXPu zE&) zF|vIu8%7-tX-fIXOrJc$f^0;<2JRvs(L~TKhrR zcg}=X{7VEMc^J6vjE~}0Hk@gYkD)4Rlu={2PjjYZ?zHyG7;gGrsStI>qwRY!pXI1? zWE2k;Fo*t@?s(|Ati#NU>eq^0$15^KCOZOAk?PEQCK7R z8wHRB@QYK6!m7hEr*Yd%E`#~K-wV-??SeSvj3FMJ!z$g`J&Lg#&L@WRkKz0zGoTlb ziQ%&-v`+xR&W$>-H|9VnlM7XjQqj0cF`PfgaQeMt7s0=-f>yb?UZ!F#=BRzIJO)1i z6>;;($|Z*LyK&h^Dn9#^jZ5{w?%}VZT}SPvRa1>ia1}#Qd0b)kYEpn66q#-e%LHK> zB~=B8hmoB2T4MxHYGI7vgH0G+<>4NqYu|&{X|Vdv*H{Ast_Hf8894?e2YXMe?7@Aw={wwnGp|5Jx@yu9 z4S?;LonSJvrH%$ZPiG!Q4b!IqP?Uv;*vXByh$LcmOhn@OyolsC z(l+APG5$DlgYoBx-@*86#N&+bBtFFWd&EZ=-$(p>_7U(i@h-+2<@^I;4dY9RZ(w`{ z@jZ-d#1AtbC;kKD7V)L>VdYiIBgA_cf0g*njF*Yu&iL2F?_vBe;#(MBAoCayWyV{G zf6w@(#2eU$ZX5AS81JsbZz8^m>EA;9R>u2@XBfALJB$w#f17cK_?L`7DY;CNwwI{XXb{Coa97%5ce`6z>k7gFiOmFa9Ymp5aX zgxNosi^TGS!pz$-%cff-lQokYQ?_|uEL}*7p{xap=E^p=)zPk6R+S|RIfW8dmRi~S zl9pomp%^hMYb#`SfFiXsDU#ZS{(F_Uqv{X!NZjH1>F}JJ9r3D5w-Iw218(CgYIG*d z&V&owy>@56t3cB=JNtdoq}O({V7f^d9CT+lSjbe{m_FqavaA|eN=L?>xY_Au$bzO) zvb_1`Qf@jdUo#m?m;+!SN@Z*leySUblXfC?cgnStkt-jmyE960 zAeBkwH<+X*cZ*6*yg&sw7=uh0=0Mgm(Sg}Uoh0nQc7ZR?wEtuis7SzmgymN^(}r|e zim00;Dqb9<+A`7BcgbS{`gp3~Bj^OZQOnP%8m`W%C+M6=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push 2 - sub r12, 8 - mov qword [r12], 2 - ; push 40 - sub r12, 8 - mov qword [r12], 40 - call word__2b - call word_puts - ; push 1 - sub r12, 8 - mov qword [r12], 1 - ; push 2 - sub r12, 8 - mov qword [r12], 2 - call word_foo - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -word_foo: - call word__3er - call word__3er - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_rpick - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word_rpick - call word__2b - call word_rdrop - call word_rdrop - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/main.o b/build/main.o deleted file mode 100644 index 9008a990bf076b7c270fd49608be4717f8ad25d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5488 zcmbW4eT-aF6u|G;-P&z28*OMfD~ zeymRnKA0z2=S&Ee0B{L!yP>7P?y-DHc7wUTBIuT!Z6Iq33_8 z4{B+IVL-n$QeQEU-i4Jw+@^@`f=UIHs9;1Ib@v#>b$4Z?af%Y14D?>=DPaydwI7+1 z!2m%+Ifc|g5HDd!amplx6_NQWjTICCL(P{fY1ARieB~YtLq*d=P$HQLrgctmFmW!V zE&=+17OVP9Pf^L(q(+a9V zDyzr5TqqUvfaZRy<@fE^3j>h_dcldDrelp`@YNW@_J|c=)AOSXhwu!A>oj+?vO%!U zMO3fFk)b)NAypk0OHNH%U5^bT;f-6h4ST~Iw?XIbfX{C2^iOe9|J$y?x6?4r2zZb9 zErwf{{}mdmQ$Q^2{r3ay4FjNZHMqk&E9>y#(vSS}A{Pf`fC!_FL-<(H+zGAuPpx@3 zoI7`$mj6qHA9(<{?v4!MQ8wIh&<~?2S`^V@pi^_lWbL%(@-QCy4rvf`M`F!8u%5-3 zyKe{|EZ`2~`zJ&D%jN76$PNx1)ED}@zUUhm?jEIrN5MGkPZ_SF;eJvD4s6o#bDQAn^SmfMo)wFZRvpQhu?-g<%%I6T*DIG-8zK18}7%3d)RP)k`>VN z|A>LPl-kFD;N-?!I2+R-)X9x1#;9q$q8RRVUx+P<^b8r_MWAbr@)vGE2Mo?tDHX;jz zWt3DkAU=%bvX>i!_@oxbApWokqpdj5ZnS-P&!rmdzWX)yg|=b0bBrv_dsv@v-I(;4 z?IUgQ0(6#JAFfj~K%c^zI^>G9{G_<2L7UjyA$`dF9rWoKo(-Jj+T&)!Es%}-f$knK++8x2dC&z8 zH8`eEYk&s9-GcI9D|_++kV~)sQ!bZ2hxYO)x_L5Mm+&{d^j5$E#-dnSc@P|LfG^J& zap{2oz(}P#(QFw`5<^LYuOeE~6?Ky991%^#ow$g0WwRohU6XZeC*B3pUA^i~V>_9O zD|^p-#yd`3D-M*WGpL#N4G!NEaJf^jnrYr3PLyULfh7!H_`ZN|0xdxZ@`Z97677tu zaY$Ut_%b;TiQ5=oPW%qWZzbNx_-f+!GJYrV#~Hty_-l+mNc=;_A0@tr@n?wt!T3wW zkHZZLTx!0Mn9I04HBiq>7$23sA#pw99}(|j{Bzu zgB*v%KE{tH&Rgze;!Ug-&nA8`#G9Z!VC}jf{Ur_O~j(Z zJ|MYVv|oIX9-4taCb|5ovVXe5Wg}H|FV4VUsqpH#-%^_`%JVu1ZKxhZ|Xt5+c#L}hLJ z>+Q3=a@YYe8Bdr!R?0K?hSBa+CYv;S;#SH`Ws^xNq+QWVO{OoIrg^Fr{v!Hq%YitR z8T@fnhLB?wgR5Bdtdp>Uv&nH(W|Yc!n<|G&lgOl#CXNFc1~kx<>0Bx`MJXdBZQCnv zAfimzUs_+z$qM{}X1C3BvOi_PjG1)mE=BunEA5!@QNwr_StqR3mggxmS23*BX=T`B zrLF85lg#94QKjk1Q3K*JQ;GLvG6LU$>AXoX2_2Gv^9S3lZl(j}u@zA_NmPCqv?7`4 zi|vI|F||z%l-0S;hH+@q@%?(R0+x JXMnu`{R=O^X|@0W diff --git a/build/override_dup_compile_time.asm b/build/override_dup_compile_time.asm deleted file mode 100644 index 2b4141f..0000000 --- a/build/override_dup_compile_time.asm +++ /dev/null @@ -1,594 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_read_stdin: - ; stack: max_len - mov r14, [r12] ; max_len - add r12, 8 ; pop max_len - - ; mmap(NULL, max_len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - mov rsi, r14 ; length - mov rdx, 3 ; PROT_READ|PROT_WRITE - mov r10, 34 ; MAP_PRIVATE|MAP_ANONYMOUS - mov r8, -1 ; fd = -1 - xor r9, r9 ; offset = 0 - syscall - cmp rax, -4095 - jae .fail_mmap - mov rbx, rax ; buffer addr - xor r9, r9 ; bytes_read = 0 - -.read_loop: - mov rax, 0 ; syscall: read - mov rdi, 0 ; fd = stdin - lea rsi, [rbx + r9] ; buf + offset - mov rdx, r14 - sub rdx, r9 ; remaining = max_len - bytes_read - syscall - cmp rax, 0 - je .done_read - js .read_error - add r9, rax - jl .read_loop - -.done_read: - ; push len (rcx) then addr (rbx) - cmp r9, r14 - je .done_no_null - mov byte [rbx + r9], 0 -.done_no_null: - sub r12, 16 - mov [r12], r9 - mov [r12 + 8], rbx - ret - -.read_error: - ; return negative errno in rax, addr = 0 - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], 0 - ret - -.fail_mmap: - sub r12, 16 - mov qword [r12], -1 - mov qword [r12 + 8], 0 - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push 6 - sub r12, 8 - mov qword [r12], 6 - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/override_dup_compile_time.o b/build/override_dup_compile_time.o deleted file mode 100644 index d7df610e287c0467237c7cfd8f9bc139e12ce80a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5376 zcmbW4eQXp(6u{?f3k8(B05QZ=gXUC7;OqxPtJSmw%&zVk5lD;O5sY&hl27C7@{$X!T6DYG1drL-hwgnvcE9U|!YREW-?N$pP2DC$G>|21(e{7qx#otG)_4im(f z-gM}reI4Ux8yTQ3kN67Us9MW@i=aTro{v9g3R_h5$G@5E{0Gl%69^`cpfsCjsOK#> zLAWpt2K@YK%|{4V9DY1@;M{VK%zzW2;HlXS1P_-FE_=v)nR|7&`ZBG zhNaX)Hy~dTZ>%av>+(7vUQ=B6K%^W>R5s!<-Md_I-CGxrT_i*!1Fcv1LKs619eAc- z&_P&H4k2aW#19xkyl9Z}n)rMb#u{>fuI9^`#B^{oUzvy9P}1}Wq)0}BVJ!-G#ur2A z5}+MOF{`g=P5fnc6X zDPJA&!C9&xRUSJery`x4kFCSe9s9Jcr=mOdL**WV-*N5QFL6=-TW?07r=g!=upSOd z441C-D-_mB0lu*I4}{7aIzZ)YaD_js&Le;;J`eVboE)S9JdDH!@mSHkajoSKt>rlE zJ8!>M`cp)odj`1f4G-d0HoP&A51}e*R8XUTrRI&w+-WTnL%8X?q(aggPPQDvd{&a) z=|MbLz#RHdpO2iKm?$iV=wQP^exbe_D}jRHom3(?3dUf4Cg7?V-WQYLKM1w4VH8dh z{EY(00{F$LC1KTJnKQU;Mi#*QKJ9|&hxS06a>fu3&SAOk?Hk0{4eyxY{bP7P$qeYF zzeN9B3hfvm*ttm$_Qn(lWpbe^Nh%sYDTepQ5Kg~q=sLLTDrl9P+hrH;VQn6O-ccJP-Lt=E)#@l zlvEWU9!7H7tBnCXsf96sFE(McSNc1R_9IW;rorla-(X#6TaUY!%hc?}{6rf@rNztu zX#>m9ST23EL5%=)3Ulg`Gtx@u#gj9%@l##WhSWboo35dma7TsWEN$ZG=(J{SV&BhA zP=Fc~!T4`m_5(P&?Mk5F4z^VBv<}PV&XCGW0FTzso(YdoG~Qv|J7;)DWhnEY3S261 z44>uz1%j&u>A@G}k7uBod;on>!JE1guC>V(iFC?Mi9~myAQFX*1=n#?-OzfxS3Rlk zSeca4_pNI_F_wC9Zel8hx+%Y?@V$-u?&7O%iZ?pGr|}KEkg0bOZ)N;$;+>4IC4MjC zCh>nL$GD0wBDOI8H|f8`_%zv%h<6#EL;N7)*APF= z_>IJQ$u$#iVx`zY{1(PF;%gXRMf_pLA0X~Bo+kbt<9Xr-8GnNKNybaW`IadYUx?>) z=-NU2Hpbr|ZZN)!_=AjpK)jprPl)$1uGT3c1{gm<`d6`!@NwepjK}2sBjO&$7ZKmc zcsucfjH~sFh*OMbN&g4NHxs{FzAS=-zD&H6@%M?}#rQGe_cQ(z@kbc1m-&i_rx~A3 zyux^#`1g#r5wFAdL+I)tegorL4SpZ-zg6Y3kgBrXHTZ{BK6&in8vHPE{{Q%T7%5iceJ6wHF4~#&O}WP`$Fb9vnJ(td zo?LI<&RC{v_gaZmp;wp%H|4nWNMv)SwaIqP$5NT1CHits+UzlxHv6sC7S(d9416k- zc5>9h@f0icrHDB>S0S?%6seuHN$M7R9#!Jjsz1~tackhGHE?dWc2`~cjg;S5?>ClF zqb+T=rG3~EwA*@o1)8qe))SIiLEF!Q=_jGL*PmT)F{~ju7+{Qd9Po4=!Tf3vSvDk0$#G8Br$ZFRJV+NjjIcOzeju3`w9Sv&Bs2BBAsE zrR}FTdHjJ3dW*%2G@7P(_grDlBx=A~2Z?Jt!8M*RdZ^$ae z^>)@SY&1zt?iQ7r?jjXnZwfMj-@mlYWYdDeNW->+RaOtvg{(M=sD~sfEc8`vnP}@@ z@>qZlo+9`Pxj)1_eD&k$ IXCFZS0@Uv}ssI20 diff --git a/build/str.asm b/build/str.asm deleted file mode 100644 index 096670b..0000000 --- a/build/str.asm +++ /dev/null @@ -1,565 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_strlen: - mov rax, [r12] ; addr - mov rcx, [r12 + 8] ; len - add r12, 16 ; pop len and addr - mov [r12], rcx ; push len - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_main2: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 6 - sub r12, 8 - mov qword [r12], 6 - call word_swap - call word_read_file - call word_write_buf - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -word_main: - ; push str_1 - sub r12, 8 - mov qword [r12], str_1 - ; push 7 - sub r12, 8 - mov qword [r12], 7 - call word_dup - call word_puts - ret -section .data -data_start: -str_0: db 115, 116, 114, 46, 115, 108, 0 -str_0_len equ 6 -str_1: db 118, 99, 120, 122, 118, 103, 103, 0 -str_1_len equ 7 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/str.o b/build/str.o deleted file mode 100644 index 64e6be2c72f2bd2c58c280d7d759ae356a16efb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5248 zcmbW5eQZ-z6u@uUrW;>fWFbpf2*w&ALftwDEH1bq)AwSV7yNGJJL;ND~A5ApT7|EQ84m!6C6cqh~goF?wIuR3a2{UX`&$;)!_qxNzAKs+z z-TONq_uO+o-g|wyCHTYwk4MVFds5DKOt2tUH28X*)P{CMohYbnq+CglCE1znyKv_G~CuR@$xH&F(6wB`K=2OdO? zko9|TU>(*bRzj$Qk~Pej<$A8vr)NjXHEV3J5vaEeiRL{nbgR^t&)af6SK~WWg6$Te zXRnnPNpnG8Ik>3Qt;M!MZl|wY%l;$!wgm?;G7%iWi4?(xd|y+r;dK9_nsrjME~1%s z;GDU55M%!qFW$0IX|d2n+Q0@h9#Uc_B+be<%YkUwY0+PyOgexj! z7HNeuqxaNmg%f|)Xm#f_>%2bo_r8+=&Kz0}6x?YCE@ZCg5Vu(&mDd3tEnT`0Zbi{p zr*!K^&^qHSqfjUtdalZ+=S-ChS0B{!m|;-fiZVwV5|4S(ts0+hfk=6i2vRE3DYkh3DEOuC`I&_S`HD+4D^JTMi!liYS+HO{JTZ6^ols#=bu5`(W+ z=EZJkJ?S1;Ju(suYfW)uYAraF0PR4E3+|{kH9a4#D)I!&P;1D4jdSZglE>V+y%fvd zx{K`HyU0Gci|qZo$lh~hT2Ad9XY?4C1*w8Hpjnr+?3L?!uFtm`*UBm#a~y(8WeAr? zCS6w+HDI@oZKUs&Jec~>C_r-T&2W*vk1 zDL}~wtsiH>+X%I>VHD01{EGrLZ#c9N%sNbS9JkHLDj454%@F<2aX8oHh#?+4Gq>oL zI&Om2*`RehXkC>V(6hHh-!cmAEFjpqAq)1#90+A{qTu9#+E^(*hE%elj?b!zzUe|? z;vj@Ru@!2?YIEA)V{T#z+N`(*gF<(*q|KB+9T(kgy)SlmbO7?3(Oy&dBVjWv{H^J< z@TYf!k{ND=+TKoer*yD3&u0Ve`fqu;**RI5MPc7EGkE3-6J^v zka&RUe@eWW@nPb-7#}CThjI13;t>ZK|CRJ}j9(*ul<}LyKVe)g5RVvVe35K>#BYpO z5uapyC2=oXLaT|dVZ5HWpYhGacQCFK?_&HJ;{A+2Py8_B5#sMK-bws(#=D7+F}|Pp zWyW78USRxf;w#wu>oMXR8CUb<5!)D-?@6$al8m1qKQA$UiufCh|3dsU)N zB=XWhd^_X&h{qT|N<7Q>$HXr)K0^E^;}?nZ56C}=uV>$nlakAe8$8r*&%;aQ{M{%p zH)5&e3j}?hIlih$pYxTZ&%Z|>l3ZRKA6W4_TrLbp)-Vrma`^1AJv9&CL7aczVtkdb zU*;{XnOHpX2tJm>=}uv!&2Y-3n?I2>qP;QG=nls-QPGo3MT|CMeXU&!)Tvs^Vc;en zO(@!xG1CGs;4@_;qCN3gB5EWP@x6+6rD6%wfS+oHTS+?->xkKw@no`#e8f5us@5J$ z#L~MBQja_?8m*aj)r_RTTxuk{qbXHO_k@Y1lBPmN02Ha7h>_IHwCz#i zfa4zZNE~qe1YGAvpw)3{SHgCMf-(Xdh}1`n`iL#9bL;hOwgM&HsBbHhM%}tS7lu6* zot^gRIx`8Uj+3Zdh7;6blG2f|2X55c8A?G_X{X%rcE#*;q>8H1aKvbj#cg%F>2HfC z(@~>69E%(AbTmqdOgVBXNp{&wg$dk2sQGkzaNB=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 11 - sub r12, 8 - mov qword [r12], 11 - call word_puts - ; push str_1 - sub r12, 8 - mov qword [r12], str_1 - ; push 11 - sub r12, 8 - mov qword [r12], 11 - call word_puts - ; push str_2 - sub r12, 8 - mov qword [r12], str_2 - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0 -str_0_len equ 11 -str_1: db 108, 105, 110, 101, 49, 10, 108, 105, 110, 101, 50, 0 -str_1_len equ 11 -str_2: db 0 -str_2_len equ 0 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/string_puts.o b/build/string_puts.o deleted file mode 100644 index febf51b9113299fd49da23694dadc7fe9f3e02a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5712 zcmbW5eQX@n5y0QYc5pt*T??hAHC2j^DyVSy&OxmqRCb!sU9^Xwq*YbXE@$5+xw5{q z?)Gq~oHnVIitW`Br~#?;1CZb!K+u0ct}6vQ=hz8>K%+`T3RG2_wrLA$f~pviliGbw=p_*TlK- zw^|GzT&2N#LXZ%8mq8!LcL?6MMuV#bmmYr%T}dTStrIcVz8GCP9?qKY&H$-qe9Fu1sElG^rUk9K1_8$eS%6iLDaGd+5E z)C?!hj6sUX6LjnPXlLmLaGd~-11V%TQ+2bb&OZN56bX71V&?|IwH{eb%f^BsZEhFS)_Q9B1K{$YOb9 zYq02(^L^8}hvHp^Ki^y+h;tL?YjbjXoi0e7$IZmKNL%xQ$#&e(q{e&7&P?os%i zFh2J?T-5)qwymj+8fafKoKL!ml;s2;tV(!~H_R zK^nlqd}11p6~kXL(&vrz3D|f3A!G6b75~W(ft&v9G;U?fUj+FKs-i|6H72$h{sQIB zNH=D1(+`nC)}PI$k77RSS^xAj9xN~%`ui@#&NdpAE#Mt&ILI&5cXvHhu>6x+1V_Ol ztWN{3y5+yw0zX1%EY6~^MerXKKo-C*hL(j@hh=tg+sto(_zn(%_cJeppA<3pgE4F| z{kduM-SXeC{EsaEACv)e@5KZD^9&0Gt2 zQ#-A5a~q}N9?VhtC>?{ZfQq_fYSTK)f8VXb#YR?*D>C_O7VfEkOn4y`q za7TseI-_xXVRfI;nEPih6rce`u=M`kLjaCHbQMrA2V1Io+Jxou){ydzfEPM1Uki_j zH~y=pf6nrclPgz36?k0W=sw2)1%j&u=|L}oHtz2;r=YR|uuOQcjSv;jJSBv6fV&*m zEo~StmEF8@3q>cr7VjC<*H_AOc6%z7&v`kO8m?4SsqJQPwtl;H>dT3 z(QTg?Yo|KbSV^H{#VFAdO!0>ghXy*K1k2-_EqM0g@{^r zGyjg@-(r5h;Cbd_f)|;8U+~?`9}#>X^A`l4Vt!2U$C#fK{7L5j7W`S}m*WCOu9v7C zQ&$K+%lsC>wI4C{b-{nn`on_1!@MN;UzzU}{9nu;6Z`|_&kNp3{g^r;c!K$9!LMd6 zOYU0cy`mIT%)cbK&Pz;f7yK)%f1ltMb5HPZF#omSI*$;S;4bT*6uin@ZkavIH;V7; zA2GjG@Q0aOf7UBS;Y-zT_U z@0h9!eih|6rv5DWb<8`&->WI+pBMa=Hhe4dEkgfJ=64I8V_p<|jJYrP_lQ%_VUnS> zzYVVuKi9xlY4m!O_18xsw13`4{~6Zr5&F-uzQF1w)|Y?3A0$q=sd$SFH ztI1n)@uxQYUFP!t0iS}I5^dhUCy8H{~QLjX6c0r&SOJFT4TPB&=7wd?7j; z^;6`LTM8DHx>}Mi6&)M<5f390sL5j0b(aarf>SOB>5W(=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - mov r9, [r12] - add r12, 8 - mov r8, [r12] - add r12, 8 - mov r10, [r12] - add r12, 8 - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 9 - syscall - mov [r12], rax - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_foo: - call word__3er - call word__3er - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_rpick - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word_rpick - call word__2b - call word_rdrop - call word_rdrop - ret -word_main: - ; push 3 - sub r12, 8 - mov qword [r12], 3 - ; push 2 - sub r12, 8 - mov qword [r12], 2 - call word_foo - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/t.o b/build/t.o deleted file mode 100644 index 0ea6b002457362013319686525e35b6e86cba0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4128 zcmbW4U1%It6oBvMr*6{PU8L5afm$5FU>n;_ql89HAki7!fV2gD2#k~Nrd`bL#@X4V zffQR}q~jWVNtJ@t7mNBJBKQ+4YTB(SRa-R*Dy6=txS)M#eMlrJ>pAzH*_j@*5ggdL z=YHq+o_l99d8Rl1P)#T#yelLg5dO@gLUj2e$z38W>H_rtiI@w2YnXdijRJElMU>gy z0CV)OWjuqz0kE$ZJPc6c+~9lPoyTzXfb~Ptb2Tf_EX_RD-}W(3j_rPu+!Yb*asjzTG*KI5Vi-KVYtnj;etxJNK}Yx zQNvxQxZ(C|(SIq?DURMfo)U7XWR=L23j+iVWeTZ-AeDNc-#kfSkJhBh*h2v@RFhmu z6pL?C?!hpa94iUovb{-5aI&xkN|ylrz!a?XWBS5UHM$`XsnD$H9mS7v10&N#?46$_ zs5`of?v+(^udSkcbrs!lU#Ay@zYlVKP_qlIf-}%pfK3IVk2=#=*g!q-#vL^8)MgrR zk@XZSz}E(Or?jUh?D}3z&PJwB!NHA8pVlKEoP*!IzWH0+(Eqk;@a=SrGYj6c*Dq`0 zG90R20kL|8G4XleXu|}kS}E-ASNOovqXGaW0)-@&U|6 z=~Hg;Hu^n(4Q?(<&%zBJHHZo!@YU$a_$Dm9geGGwW)TC^)#@Y{olp-8M4nZ{tfXL82^d*F~)x({yyWEiGR)bBJuATua)zVSYmuV@r~@L z+(P^g#&0LSjqw)Z-HgYGKhF40;%UYoChju6oA?RF`-z`oJW2c#<4+U+oAHChZ)P7u z&k^6u_>08b8CUxk5^2Uyko_d%?+`!AxcnS|bM*=1vt<7pvQDJ-r997}Y<8Gpr1oW$G?>bya{Em( zlc^HR2F)$=KlOnB?-}{tO$13sAj?^(fPRtK(#s(@O zJ;CyXK~HEWp)FyyB|Ny@m)rJw2Gl#VZErxE^yMAfD(*^1r@hss^O=f_d!h7Jh7x9} z9T{)oW}DX`8$@Mo`|BM}dF`-$aWI>uv{ou3@H>ExffSRFD*?v>9Mxbt&^=obHAtd% zejq<6Dw2u5-jjgG6CbT*`XZ43{lMJk>Wuc#K}C+f%kcez*P~VVNPuJfrLu~1gz;tK LA2L49zB&E@4(9W5 diff --git a/build/test.asm b/build/test.asm deleted file mode 100644 index 90ffe3c..0000000 --- a/build/test.asm +++ /dev/null @@ -1,866 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - mov r9, [r12] - add r12, 8 - mov r8, [r12] - add r12, 8 - mov r10, [r12] - add r12, 8 - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 9 - syscall - mov [r12], rax - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_mem_2dslot: - lea rax, [rel print_buf] - sub r12, 8 - mov [r12], rax - ret -word_MAGIC: - ; push 99 - sub r12, 8 - mov qword [r12], 99 - ret -word_add13: - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 8 - sub r12, 8 - mov qword [r12], 8 - call word__2b - ret -word_Point_2esize: - ; push 16 - sub r12, 8 - mov qword [r12], 16 - ret -word_Point_2ex_2esize: - ; push 8 - sub r12, 8 - mov qword [r12], 8 - ret -word_Point_2ex_2eoffset: - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -word_Point_2ex_40: - call word_Point_2ex_2eoffset - call word__2b - call word__40 - ret -word_Point_2ex_21: - call word_Point_2ex_2eoffset - call word__2b - call word__21 - ret -word_Point_2ey_2esize: - ; push 8 - sub r12, 8 - mov qword [r12], 8 - ret -word_Point_2ey_2eoffset: - ; push 8 - sub r12, 8 - mov qword [r12], 8 - ret -word_Point_2ey_40: - call word_Point_2ey_2eoffset - call word__2b - call word__40 - ret -word_Point_2ey_21: - call word_Point_2ey_2eoffset - call word__2b - call word__21 - ret -word_fancy_add: - call word__3er - call word__3er - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_rpick - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word_rpick - call word__2b - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word_rpick - call word__2a - call word_rdrop - call word_rdrop - ret -word_test_2dadd: - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 7 - sub r12, 8 - mov qword [r12], 7 - call word__2b - call word_puts - ret -word_test_2dsub: - ; push 10 - sub r12, 8 - mov qword [r12], 10 - ; push 3 - sub r12, 8 - mov qword [r12], 3 - call word__2d - call word_puts - ret -word_test_2dmul: - ; push 6 - sub r12, 8 - mov qword [r12], 6 - ; push 7 - sub r12, 8 - mov qword [r12], 7 - call word__2a - call word_puts - ret -word_test_2ddiv: - ; push 84 - sub r12, 8 - mov qword [r12], 84 - ; push 7 - sub r12, 8 - mov qword [r12], 7 - call word__2f - call word_puts - ret -word_test_2dmod: - ; push 85 - sub r12, 8 - mov qword [r12], 85 - ; push 7 - sub r12, 8 - mov qword [r12], 7 - call word__25 - call word_puts - ret -word_test_2ddrop: - ; push 10 - sub r12, 8 - mov qword [r12], 10 - ; push 20 - sub r12, 8 - mov qword [r12], 20 - call word_drop - call word_puts - ret -word_test_2ddup: - ; push 11 - sub r12, 8 - mov qword [r12], 11 - call word_dup - call word__2b - call word_puts - ret -word_test_2dswap: - ; push 2 - sub r12, 8 - mov qword [r12], 2 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word_swap - call word__2d - call word_puts - ret -word_test_2dstore: - call word_mem_2dslot - call word_dup - ; push 123 - sub r12, 8 - mov qword [r12], 123 - call word_swap - call word__21 - call word__40 - call word_puts - ret -word_test_2dmmap: - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ; push 4096 - sub r12, 8 - mov qword [r12], 4096 - ; push 3 - sub r12, 8 - mov qword [r12], 3 - ; push 34 - sub r12, 8 - mov qword [r12], 34 - ; push -1 - sub r12, 8 - mov qword [r12], -1 - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_mmap - call word_dup - ; push 1337 - sub r12, 8 - mov qword [r12], 1337 - call word_swap - call word__21 - call word_dup - call word__40 - call word_puts - ; push 4096 - sub r12, 8 - mov qword [r12], 4096 - call word_munmap - call word_drop - ret -word_test_2dmacro: - ; push 9 - sub r12, 8 - mov qword [r12], 9 - call word_dup - call word__2a - call word_puts - call word_MAGIC - call word_puts - call word_add13 - call word_puts - ret -word_test_2dif: - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3d_3d - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_40 - ; push 111 - sub r12, 8 - mov qword [r12], 111 - call word_puts - jmp L_if_end_41 -L_if_false_40: - ; push 222 - sub r12, 8 - mov qword [r12], 222 - call word_puts -L_if_end_41: - ret -word_test_2delse_2dif: - ; push 2 - sub r12, 8 - mov qword [r12], 2 - call word_dup - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word__3d_3d - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_42 - ; push 50 - sub r12, 8 - mov qword [r12], 50 - call word_puts - jmp L_if_end_43 -L_if_false_42: - call word_dup - ; push 2 - sub r12, 8 - mov qword [r12], 2 - call word__3d_3d - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_44 - ; push 60 - sub r12, 8 - mov qword [r12], 60 - call word_puts - jmp L_if_end_45 -L_if_false_44: - ; push 70 - sub r12, 8 - mov qword [r12], 70 - call word_puts -L_if_end_45: -L_if_end_43: - call word_drop - ret -word_test_2dfor: - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - mov rax, [r12] - add r12, 8 - cmp rax, 0 - jle L_for_end_47 - sub r13, 8 - mov [r13], rax -L_for_loop_46: - ; push 1 - sub r12, 8 - mov qword [r12], 1 - call word__2b - mov rax, [r13] - dec rax - mov [r13], rax - jg L_for_loop_46 - add r13, 8 -L_for_end_47: - call word_puts - ret -word_test_2dfor_2dzero: - ; push 123 - sub r12, 8 - mov qword [r12], 123 - ; push 0 - sub r12, 8 - mov qword [r12], 0 - mov rax, [r12] - add r12, 8 - cmp rax, 0 - jle L_for_end_49 - sub r13, 8 - mov [r13], rax -L_for_loop_48: - call word_drop - mov rax, [r13] - dec rax - mov [r13], rax - jg L_for_loop_48 - add r13, 8 -L_for_end_49: - call word_puts - ret -word_test_2dstruct: - call word_mem_2dslot - call word_dup - ; push 111 - sub r12, 8 - mov qword [r12], 111 - call word_swap - call word_Point_2ex_21 - call word_dup - ; push 222 - sub r12, 8 - mov qword [r12], 222 - call word_swap - call word_Point_2ey_21 - call word_dup - call word_Point_2ex_40 - call word_puts - call word_Point_2ey_40 - call word_puts - call word_Point_2esize - call word_puts - ret -word_test_2dcmp: - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3d_3d - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 4 - sub r12, 8 - mov qword [r12], 4 - call word__3d_3d - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 4 - sub r12, 8 - mov qword [r12], 4 - call word__21_3d - call word_puts - ; push 4 - sub r12, 8 - mov qword [r12], 4 - ; push 4 - sub r12, 8 - mov qword [r12], 4 - call word__21_3d - call word_puts - ; push 3 - sub r12, 8 - mov qword [r12], 3 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3c - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 3 - sub r12, 8 - mov qword [r12], 3 - call word__3c - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 3 - sub r12, 8 - mov qword [r12], 3 - call word__3e - call word_puts - ; push 3 - sub r12, 8 - mov qword [r12], 3 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3e - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3c_3d - call word_puts - ; push 6 - sub r12, 8 - mov qword [r12], 6 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3c_3d - call word_puts - ; push 5 - sub r12, 8 - mov qword [r12], 5 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3e_3d - call word_puts - ; push 4 - sub r12, 8 - mov qword [r12], 4 - ; push 5 - sub r12, 8 - mov qword [r12], 5 - call word__3e_3d - call word_puts - ret -word_test_2dc_2dfn: - ; push 3 - sub r12, 8 - mov qword [r12], 3 - ; push 7 - sub r12, 8 - mov qword [r12], 7 - call word_fancy_add - call word_puts - ret -word_main: - call word_test_2dadd - call word_test_2dsub - call word_test_2dmul - call word_test_2ddiv - call word_test_2dmod - call word_test_2ddrop - call word_test_2ddup - call word_test_2dswap - call word_test_2dstore - call word_test_2dmmap - call word_test_2dmacro - call word_test_2dif - call word_test_2delse_2dif - call word_test_2dfor - call word_test_2dfor_2dzero - call word_test_2dcmp - call word_test_2dstruct - call word_test_2dc_2dfn - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/test.o b/build/test.o deleted file mode 100644 index bdfbac0b3bc4931fc68ed187689da36f9b14ed65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7472 zcmbW6e{fV+702&}kS3v;R4BzZ)1OP#mZq>t+GfhsWcbmybt6>~9Atdm><`#6yPMg4 z%db+w#>}vdndu;m;?#m2QHJp!J6cl^3#^6O0v%D?DoCp$eIo^_r3D)5dd|J)zIXSK zjWfQPeec}Q{ho8r{rU1>-Mq;Bnm|D4Daeo0dyx_p!DE>SOP4f_9?*cSfkn0r@^ z0*fbARy0=@#Z^#7{|St5`xpaMjTV`SnjEct^tP97wr4PxUN1yIpkgh;MVUkroa-eReRo-{H#hP{0D!viE@bC5e z0UX&d6{uA#S%b$4C&Q4p(;&rn0X|Us@kV$U*%V(67vGH(k2FoBRNko%7i)th90wqC zgZ1G7jc|ByFv7)_V7LfX%0;4~NU%9vyjt;aacQvmib`~fp!Zx|32msxyvWoR1~7%P z30Vh0ynJB1c_Tv$gVR(R3n>7GnkIYFjLA<^?q(Ql95V@Ew{_t&X5qpNNL>Q-11YGi zE!Kt6YIKSbX{aS=b(VJH1U79d;n?}Dn01@Sse5Xix~=2XJv~m{5Bxf7Nci(0`v*A} zVW?mY^bEnIg3&`G(=#-M#y~&YsXRM4f(HQX8Z}l1$Ai)1v!$MPSmjs@?rqw%4;F6I zru|mabH9b(QR|l9;e`HgU4yT)FwS1^-dowNfitkE<_U;3PlN|vG?q3LfU2It>>lzL znFr?{1|QlAmO2Q$vNR6X24m1q*gBws0`7cm<5A>p{HR>^YVmOP3RvwGz!oLx-X$sf}7X8*d<7_IULMxs|tZVN7q;~>$^nhN|Y&HWIg?;1~W9u?m+6zHep$rwjb zvBFT8TR|?eL#SA2D9k+M5wjB&q45+yLPfKoxT2NEQE~SDv3o1?Sc{57hQd6@q+$sw zb{YyZQ>j>piVcRs91p1op&|(iZ`YZr%Hy&HH|rdfxG^-piMOqI+k>}bc*C9PUWb$1 zinlM|Z6)3Wo&tB`O`f`CwB$?YJZ}6a@ixE?of58Fb+tN)RgP$lN1do>?ak*!Ykqm& z$vM$puvVwllghb7UsUO}chx6urdsiCc`U(%F~0!uI|DcVmDhwZzChIHM?id<$?S&XZ^1LCuc|C;n)Wc(oUEaSf?{%yvO6W_x4DdN9i{2cLD86PG72gd7UIUq(E zzlQi!wp6YsejDSr5ueGp8pnX>X1s&+iy41_c$)Eth!+`OM0`8rHt~IoFDL#N#vS69 z7++8PT0BdPt4RD7#y1l0VEifKX~uUDA7uPl;+q-YO?(gICF1{J{1EYrjK4;_0gqAR zdW-n=jGrcc6XWj_Z)aQ`F#+)q17Zo|HxOUO`0d088NZMCM#eu+d@JKg;y-14 z74cs&{si$ujBg|UC&ovJpJM!F;vX=6oOm6+x{T{I@vksGO8imAC&_sYh^HC9f%rbg z?<9Vb@%xEig|BAgiV(kp@ukG)Gp^QmKx7zSNBS*{KS}&k_5g&&Yy4r+z| zu*c=W;?=!Tg}>?X%C`Smg`X!r*1rcgSNVHMCed3+^~LXY5_zXJnokQm??iJBJz6ta zJFzO|*ejxag@jm{&Bg8hf|D0`17*(6Bv$sNG6_4I>07O6e=e1AZ1|~Sw3pQJ)UuTJ z?8|2RDMo5pMp?;JCY4`qlT0=hFZ8Q6<2levlwFa?DJ#D+N-URk6tY7gBs-I$TBi{E zx~dL&@lZ$AAwN#Y4{nEgy^z|7Y9pzQ4l>%}c3WJ-S-#yC(*hbhyDetaCVabnrsuAV zbXxZ=UC4Mg&V{OvW~jj|4M#?I+-}n&lmk<#bAEsOQ+haZzL`#>VeImKIz~_TgW);U zP&_`XO_>j8ab`n_d}+bp_G^?_W)ni6PI#$HhHjfBOikOUM zVyo?FoW=_mI`oy7^97o4s!tdCR6+{s3zSy>_YWFEb6CY>tMJh(G5V zL}R&ZMYE}-h}fy5os9P76WD24N@U`8J9U>_6IdULGkvJSyWQ~aFl?G`ij;&E7O~-O zP!x)(k7dPt%UrrttQc$SU6m6txb@zlj5^)h{d(tmf!KmQb0 t=lEQ5M?Lz&$FsaXSB0-IIK~+*t2i4NzfAm>jIX6{+#Ym>%g=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_main: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 13 - sub r12, 8 - mov qword [r12], 13 - call word_swap - call word_read_file - call word_dup - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word__3e - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_0 - call word_write_buf - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_exit -L_if_false_0: - call word_dup - ; push -2 - sub r12, 8 - mov qword [r12], -2 - call word__3d_3d - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_1 - call word_drop - ; push str_1 - sub r12, 8 - mov qword [r12], str_1 - ; push 21 - sub r12, 8 - mov qword [r12], 21 - call word_puts - call word_swap - call word_puts - call word_exit -L_if_false_1: - call word_dup - ; push -1 - sub r12, 8 - mov qword [r12], -1 - call word__3d_3d - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_2 - call word_drop - ; push str_2 - sub r12, 8 - mov qword [r12], str_2 - ; push 22 - sub r12, 8 - mov qword [r12], 22 - call word_puts - call word_swap - call word_puts - call word_exit -L_if_false_2: - call word_dup - ; push -3 - sub r12, 8 - mov qword [r12], -3 - call word__3d_3d - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_3 - call word_drop - ; push str_3 - sub r12, 8 - mov qword [r12], str_3 - ; push 13 - sub r12, 8 - mov qword [r12], 13 - call word_puts - call word_exit -L_if_false_3: - ; push str_4 - sub r12, 8 - mov qword [r12], str_4 - ; push 25 - sub r12, 8 - mov qword [r12], 25 - call word_puts - call word_dup - call word_exit - ret -section .data -data_start: -str_0: db 47, 101, 116, 99, 47, 104, 111, 115, 116, 110, 97, 109, 101, 0 -str_0_len equ 13 -str_1: db 111, 112, 101, 110, 40, 41, 32, 102, 97, 105, 108, 101, 100, 58, 32, 101, 114, 114, 110, 111, 61, 0 -str_1_len equ 21 -str_2: db 102, 115, 116, 97, 116, 40, 41, 32, 102, 97, 105, 108, 101, 100, 58, 32, 101, 114, 114, 110, 111, 61, 0 -str_2_len equ 22 -str_3: db 109, 109, 97, 112, 40, 41, 32, 102, 97, 105, 108, 101, 100, 0 -str_3_len equ 13 -str_4: db 117, 110, 107, 110, 111, 119, 110, 32, 114, 101, 97, 100, 95, 102, 105, 108, 101, 32, 102, 97, 105, 108, 117, 114, 101, 0 -str_4_len equ 25 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/test_read_file.o b/build/test_read_file.o deleted file mode 100644 index 4d50246d918798de61737cb3915fb6c8f035df1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5744 zcmbW5eQXp(6u{?biv^XdiUbv7iD!TarFRD^3Z_*syXI;LR^uP)dhKoDa=UMS z?_*}(eC+H!wkmbolt@H)S47+_f|5st=m%VvcUo`dnuO~n6!E-wY6!kSI%ac_9 z7uZ3#Fb!+qhi%1cwt9#dJbBwuHFA+M*us>&{)J%1bAq0$FIE1nOdTDpF=8g_82O4ccqD4Oxy4x75R6M<2o)dej0n4j| zUi!5;q%Egn%@CqRcQ5c9%J;^awbGwrZqnRcn)@BP zXR3H0o^DY1fo|**|!f9K-EgsjQ-Oe;=ya@1~#u?M$ z5o(S5rS6_exd)<6)D+5wUY;4#%Z^G$U=L;$%rF?QM4fL9iN`$Y?wpwJf=We`2vRE3 zDY@?68*4dBiB6b!@FXSFAxA|HnG8d9VSunb?_`Sz=xsWQD1DgATRyuxCFK>*^$GOs~V~)Gv z*3yO3qpJ+rF70j~#_c8Aq`ABO0fK%mp?ocm4WBRdl(FTK)B3H?$JUYPw$ET*N4M>Q zMZFh(hqSq0%cWY^zKQIn1$G+hN5Fd|m|{3|r4ul*RtcyRw}sC`(;EsvWp8kV_xt?_ z;L5LptweSX(ja$|Vcc;wcT9`_0V@@@B-kuqRYsrL0$g`ThH;lmxuc-piKb{#k^9Xm z&D|q&r^Rb>zvz?(UG7L%d@ts+(&Zi>#yuC@q5SxG*Dyp*A{#$~whAsDQ-}OMbKw-vp|^AmeUW{cF5dt2Tg5^?i`S zX4MD4)f*qky)&!2otrd4wbe&M6q`{!e5T$pUfmor2{!>>Ak{nm2A_w(qPh~L9Z+p` zUdRDL)~b)46?0+8Bph=V#{By)@VOFWol0{^!%qAPp(_{xuf?X*yLer`;8^K?Q{)FsYyN`PzH~NcW^QaXZQIJP z5PbzF?VOGK`_ltH6-8^kl^?WPZ8M!Q`oLdCDcYv0$G^8Z<_1T!WztSswDlAUqOGv5 z;Mh*O2c$>()sxD$nM*5s-+eLx-+hhZRBa-CgM9O!t!bF>Kh5|H#AjgwL)Yt4jtI`* zA)a9N@}L2E?qqx)+27CjH^kR7evJ5&jGrK0W_*nJi;SyJf{1vV@#(T05qlX|{fvm8 z7{7|_Pcy!Nc$6J}lf)M=elzhl#&zO%G2Tslfbsi?Z(_WU_|uH%iND172I4yyf1LOz z<3q%cF|P6+5jDnNBl|1ZQhJN{^^AW+{7%Lz#Pf{rC;lkoM~FYm`1i#3G5!njV~qb! z{50eL62F3dbWD}~kBD0tSMwtx?q>WlvR}*i)xBo=Ldj^ZHyrI0<)%^Zy$zhniX@dH>2r z^c1tX%woqZIEH_8XiFFRg#o7y+o4CBl{d@{S;u%dohzDRFmGp!USmnSCne%avV8_; zikxXFI#6^90&fu0HY{^6m$ghIZ{;3QbimG9jsZVaO!ts=Cc8H4dFJx@0g91bYbmKO zYh?@T3^J3A$`l7wor8APF^!&LpDJc-aF-VOhfP~ag~2p2JMSoDB*2hlD@$6Z*t=e- z6MlHKBXuH(lL&$vi5@?sC!{@r8f7Gw5=mx^WX99R13B628Bo%VWN%1o2C_F6hBp*= zJXFs8Ma!3Q5EV^ZRAHXdVR;=ll3s>v5S6tZ^micZrNa)1-m#O+y<%H$E?+PWJkc7t zf@xABgQ+Gpc<$wnQW5GzI%|oPk?n(65Xfi`7vkYUB3wucJn7P0#@W{{MUaJbc--6Hdl-*V+z%P|_UogJd;9W#^`)CA diff --git a/build/test_read_stdin.asm b/build/test_read_stdin.asm deleted file mode 100644 index 5dce101..0000000 --- a/build/test_read_stdin.asm +++ /dev/null @@ -1,616 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_read_stdin: - ; stack: max_len - mov r14, [r12] ; max_len - add r12, 8 ; pop max_len - - ; mmap(NULL, max_len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - mov rsi, r14 ; length - mov rdx, 3 ; PROT_READ|PROT_WRITE - mov r10, 34 ; MAP_PRIVATE|MAP_ANONYMOUS - mov r8, -1 ; fd = -1 - xor r9, r9 ; offset = 0 - syscall - cmp rax, -4095 - jae .fail_mmap - mov rbx, rax ; buffer addr - xor r9, r9 ; bytes_read = 0 - -.read_loop: - mov rax, 0 ; syscall: read - mov rdi, 0 ; fd = stdin - lea rsi, [rbx + r9] ; buf + offset - mov rdx, r14 - sub rdx, r9 ; remaining = max_len - bytes_read - syscall - cmp rax, 0 - je .done_read - js .read_error - add r9, rax - jl .read_loop - -.done_read: - ; push len (rcx) then addr (rbx) - cmp r9, r14 - je .done_no_null - mov byte [rbx + r9], 0 -.done_no_null: - sub r12, 16 - mov [r12], r9 - mov [r12 + 8], rbx - ret - -.read_error: - ; return negative errno in rax, addr = 0 - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], 0 - ret - -.fail_mmap: - sub r12, 16 - mov qword [r12], -1 - mov qword [r12 + 8], 0 - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_main: - ; push 1024 - sub r12, 8 - mov qword [r12], 1024 - call word_read_stdin - call word_dup - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word__3e - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_0 - call word_write_buf - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_exit -L_if_false_0: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 17 - sub r12, 8 - mov qword [r12], 17 - call word_puts - call word_exit - ret -section .data -data_start: -str_0: db 114, 101, 97, 100, 95, 115, 116, 100, 105, 110, 32, 102, 97, 105, 108, 101, 100, 0 -str_0_len equ 17 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/test_read_stdin.o b/build/test_read_stdin.o deleted file mode 100644 index 27caafde38952d3a34fb595d63bef1b2b239eacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5584 zcmbW5eP|p-6u@UqQqxv@r&cMNVwF=`&@;JIG+IkiTHS5;v}y$rb-m;^_VjWW_V!E* zQCma7^^71^L8%{qh$x5(LWvP<(o2)pk5=11ER;&ciop-Cel%*L=X*16Z#OSV1sCpi z=J!74&6_u~d-wP{^X9WOP5754R*RtLQz2S|Cbe5dy{HY*|JTH^@H3B@x1OcIX(os= zy|bZ@_BD*R&R5`k#(Bi&g1jC+-2MTw-zF#!^25hR|J)W;ef#Uk&cE^8Hh^II2ukxc ze|(%ET$qO2;DfQ^wM5-S4DPdyzwA7v@B)23tg+Kt4^jm+pnE6uzLP&2rQXHC zn9p+3J2`*{3z$QH`=s`BrBYY}(ZPm;{6c-#mjeaUJE}x*6pX?8RNyL`-sjWcKM3`) zArwv%{EY(00{F$LC1KTJnX|ZUMwY?+K5B#L2X{l9a>fu3&S8z=4G&=KrgzBn{xQAp zWd@ACzeMi^6xty`uyd0h?2TCv%H%?olTn=8lzUsvmQNnNQHRy{zQVfDcN})lk*V2(`H9qx zN{a;n()+JPW4ZK^IyC~+Da@%&&PeZ@6pzl=CyupA8&dxOZQ2GGz&9!s7wVORqw^Z| z%J2^jP=GoV!Nf1y_5wKgB=yL2-+A6r|Om10cDwDO-zQDi7U3-fw;^~x|67lvzLBtE23$Ej) z+M%_zOWmpO*x8iQ_pRr=84*!aX>&eYZWj3yF{ zx5>UHS{dI!d?Vv`5x<{t)z`$sjBh6WZpIzrk1^g${8`3#5PyeprKgEc7=MZMk23x` z@!uF%el@WO7btYe-2wT$fbkKjqlp_BKSca4##J1eXlMLu($6#gJ@IXf|4RG?#;1tC z&3L`+Yhpj+i;16Pd?|5Wa#s>>V5OKKem&!>iEm>37UB;uzLB`g_&vnmW4x32e#X0r zA7y+ialU1?6JO5Wx1S<@BjY=Xn~c9g{65CtBHqsU`^0+~|A=@$>#C^%LJV~nSXf6KU9KTRx^52ql~XGp)5@i&RDXM7*=yBR-0 z{2|8wBEFsRTA4>plo`L6_&1ENAYQ|Mzb1%Z$@uCyxK4Zx)4zlG?Tp*RbBw#hJ;om+ zeuVLoGR*=?@BJes=C1pOTc44<+yZ<=kk`lCF5F;q_Ra@^yHni z)nTn{^jnE0)pDvVUF=pU?c}MIf5dhaEA*s@IeAwhD*=ks&SgmI7CRnR;zZRS>XA4R z_(=rLtwej(rQb;TjZVLDEj60cR&&~iO+mZ4!&ji`TFo6HsU5WaELeULy1M+?bro~f zHl|OxOyy|6Jf$P&PuyzuGvq*1X*A(K_MXjMV*Zyd#@0*cQIFS=oYZ zQzGRmqk3FQ^4)fh8%jYii5@58f}iRLL0`F$edU9Tn0NUi85&LY<1(Ub-e1&E8K(0& zTbAVv8!3UB%oVfQ8A9p7b{s#wA&+co-9@(`@C%CFv2u1#HUlH(bJ?wmb~~AzYr#i# zQ|+Xk&ODg$EoJ1&N9MttQtZs+GKI|+sma}BGSov=W#I##2=S7_RE z7)+y(-&PjZM~ZBynl$W5C;@e|Tu7Oth`LFlV#a~0EembsC65Pa;c0@8q$zsCmOrPa zadkdDN9R83qwN&_JcH{c#utGMuYDno{wFKS&zFo(5uZorvL8<`y-*z^j(=hJF{A%~ E0fW715&!@I diff --git a/build/test_write_buf.asm b/build/test_write_buf.asm deleted file mode 100644 index dba1bc8..0000000 --- a/build/test_write_buf.asm +++ /dev/null @@ -1,555 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_strlen: - mov rax, [r12] ; addr - mov rcx, [r12 + 8] ; len - add r12, 16 ; pop len and addr - mov [r12], rcx ; push len - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r14, [r12 + 16] ; buf_len - mov rbx, [r12 + 24] ; buf_ptr - add r12, 32 ; pop 4 args - - ; preserve buffer info in callee-saved regs (syscall clobbers rcx/r11) - mov r15, r14 ; r15 = buf_ptr - mov r13, rbx ; r13 = buf_len - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY(1)|O_CREAT(64)|O_TRUNC(512) - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 ; return bytes_written - ret - -.fail_write: - mov rax, 3 ; close before returning error - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 ; return negative errno from write - ret - -.fail_open: - sub r12, 8 - mov [r12], rax ; return negative errno from open - ret - ret -word_main: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 26 - sub r12, 8 - mov qword [r12], 26 - call word_write_buf - ; push 0 - sub r12, 8 - mov qword [r12], 0 - ret -section .data -data_start: -str_0: db 104, 101, 108, 108, 111, 32, 102, 114, 111, 109, 32, 119, 114, 105, 116, 101, 95, 98, 117, 102, 32, 116, 101, 115, 116, 10, 0 -str_0_len equ 26 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/test_write_buf.o b/build/test_write_buf.o deleted file mode 100644 index ca032b0fa94822bf4a49049754f3bd8b56fceac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5088 zcmbW5Yitx%6oBv27E3|45du|+*0?5+z}g3h1VUP%X2$F$MykJ%aoe53%67NT&Qgda zf*TCO+F%SO5?_hohl$3-s8})4!qzqj0-`1+#76>A5J`%S)Y#hfoO{pAY!9VBoTM}7 ze&=z|J@+xQeXb?)@Qgq}xK}`|6MoC3LNxgz$xWhCl$X%|Ct_dtH zZO}&lGRC_q6A8VQ%^B)j3p7}PL<=4jx>Fu16kNTYUmV(BhV2%i=l-ZH z(dHweN(fP{J9Auz{N_-lmit@uY>M<^W+Kvy6DcCA3q4Jd)u(o^(VP>S^Aoyh`_9{Q z`Y`t|@D{8Xlpa++(t1~-^D(9NQqr74vmA()8xy-{X`>gKr4N~ZiayQ9s^E?W+1Xn0 z%;3yAt$6(EVy*tX=KP?K{<-G_fHV6S0EKYcz6;q)I^=E7lE%vc50=lZf=5X<&R4o~ zJ>r}RR!}Nb4Lv_Uq~~o_4BsBi3Rqz<-iSKS8VZkf(w)U2-2s(~CJ~fWmQ!-w*&M3A zNr_Hac<>}8^dV3{@jXQjN*iDEHDZ zw4U?;tR9&OrnR)RF}e%_N`QW##RYd*8y&k9onI0OmZ7$~@EOi+@K6D3=l4>odu1Bk z>(l7onnw5LG`cr@ot9U7#~VH7}Q!L?GWV~wM5tB&IGh~}Z% zxq-UASvbH7%^C0}2*$aB>a{l1H(TndVrwO*{X4lH`}%{2j>EbR9y$S=`Xv0F*Y5pB zZq-ToO=UOBx6@GH58nO$62qy>U4wY7;fbp`qgwq9*r{+N!C?WrGWg>2z;&m;4^O#>GX(l$Xo?mEdET^W&Y-NFR$r9o zMYA-BI{nf5lUUC})Vb7$XD+xyd+%6axLC}rhwNa(L49F;R~CGO2%Hj91)FsU=BEf( zA>y2y1Sb$`L;a|nr1%#VYTj^YQJ8Rd+YHo3ol)KS5k~oWGmPQbQ8?Y?xFIV%IoIos zI&>n=*@!a{aekL|&~yKYo_UnuSwOIVqYmtlDG=)9biw%p(oi|Rj8w@%z6<2b+L%n) zQx>+F$z-~=!%BD7c3TPCG}^KqwYHhD@f^h~Y@0i65st^~m75KCB?2Z=W@-b7qI zedQy>AN7%xT8VFA{3+tkF#a_04;kM>{9DEk5+7mwRpJYItS>of2Um-q|{SF+FT;BX7L7KP)FPHOly@+q6(rd2dGX(#g zxKMI7x!`!W$K^zOp_bl)*Li$$u4`_=TZr@DotSs^RPU*_Y$6$d0Nv%>%$*6_*bz%+P0^jU;zql%qRy2X>Xl@94Boj(Go@%(*3JmLK}^d?ncc}m z$~4lcJUZDbu!Y)!bH$#lAlVkEYvl+=+(B{JI#GLuQgvt6oBZ!oGE zx4>Omq<5H>k}};fVpiH#$Y=mVl2ZxN+S&H)O5NavM>|qC_;DKi;6_867t$4CuF&BM zD@kaK8;x-n*86f}yK6v2HyYbZw5Bh+b78ns(b?&at}~nRWSm45GM1ta(^QU>J8+}X zt&jzxvbOy3b|u_$SS6wviyIw@q-*Xr!|lm*#xy!&iKLOtm?jm{^7K-Z?sAt3Q}}~W z^Xd2Cx5F}oY^z+k%8%X|OQZyT8q(s%a`@V7!OEQRmY6h`-z1oYC|@4r$n= diff --git a/build/test_write_file.asm b/build/test_write_file.asm deleted file mode 100644 index a4fb632..0000000 --- a/build/test_write_file.asm +++ /dev/null @@ -1,593 +0,0 @@ -section .text -%define DSTK_BYTES 65536 -%define RSTK_BYTES 65536 -%define PRINT_BUF_BYTES 128 -global _start -_start: - ; initialize data/return stack pointers - lea r12, [rel dstack_top] - mov r15, r12 - lea r13, [rel rstack_top] - call word_main - mov rax, 0 - cmp r12, r15 - je .no_exit_value - mov rax, [r12] - add r12, 8 -.no_exit_value: - mov rdi, rax - mov rax, 60 - syscall -word_c_40: - mov rax, [r12] - movzx rax, byte [rax] - mov [r12], rax - ret - ret -word_c_21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rbx], al - ret - ret -word_r_40: - mov rax, [r13] - sub r12, 8 - mov [r12], rax - ret - ret -word_strlen: - mov rax, [r12] ; addr - mov rcx, [r12 + 8] ; len - add r12, 16 ; pop len and addr - mov [r12], rcx ; push len - ret - ret -word_puts: - ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] - mov rax, [r12] ; len or int value - mov rbx, [r12 + 8] ; possible address - cmp rax, 0 - jl puts_print_int - lea r8, [rel data_start] - lea r9, [rel data_end] - cmp rbx, r8 - jl puts_print_int - cmp rbx, r9 - jge puts_print_int - ; treat as string: (addr below len) - mov rdx, rax ; len - mov rsi, rbx ; addr - add r12, 16 ; pop len + addr - test rdx, rdx - jz puts_str_newline_only - mov rax, 1 - mov rdi, 1 - syscall -puts_str_newline_only: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret - -puts_print_int: - mov rax, [r12] - add r12, 8 - mov rbx, rax - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret -word_dup: - mov rax, [r12] - sub r12, 8 - mov [r12], rax - ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret -word_drop: - add r12, 8 - ret -word_over: - mov rax, [r12 + 8] - sub r12, 8 - mov [r12], rax - ret -word_swap: - mov rax, [r12] - mov rbx, [r12 + 8] - mov [r12], rbx - mov [r12 + 8], rax - ret -word_rot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rcx ; top = x1 - mov [r12 + 8], rax ; next = x3 - mov [r12 + 16], rbx ; third = x2 - ret -word__2drot: - mov rax, [r12] ; x3 - mov rbx, [r12 + 8] ; x2 - mov rcx, [r12 + 16] ; x1 - mov [r12], rbx ; top = x2 - mov [r12 + 8], rcx ; next = x1 - mov [r12 + 16], rax ; third = x3 - ret -word_nip: - mov rax, [r12] - add r12, 8 ; drop lower element - mov [r12], rax ; keep original top - ret -word_tuck: - mov rax, [r12] ; x2 - mov rbx, [r12 + 8] ; x1 - sub r12, 8 ; make room - mov [r12], rax ; x2 - mov [r12 + 8], rbx ; x1 - mov [r12 + 16], rax ; x2 - ret -word_2dup: - mov rax, [r12] ; b - mov rbx, [r12 + 8] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word_2drop: - add r12, 16 - ret -word_2swap: - mov rax, [r12] ; d - mov rbx, [r12 + 8] ; c - mov rcx, [r12 + 16] ; b - mov rdx, [r12 + 24] ; a - mov [r12], rcx ; top = b - mov [r12 + 8], rdx ; next = a - mov [r12 + 16], rax ; third = d - mov [r12 + 24], rbx ; fourth = c - ret -word_2over: - mov rax, [r12 + 16] ; b - mov rbx, [r12 + 24] ; a - sub r12, 8 - mov [r12], rbx ; push a - sub r12, 8 - mov [r12], rax ; push b - ret -word__2b: - mov rax, [r12] - add r12, 8 - add qword [r12], rax - ret -word__2d: - mov rax, [r12] - add r12, 8 - sub qword [r12], rax - ret -word__2a: - mov rax, [r12] - add r12, 8 - imul qword [r12] - mov [r12], rax - ret -word__2f: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rax - ret -word__25: - mov rbx, [r12] - add r12, 8 - mov rax, [r12] - cqo - idiv rbx - mov [r12], rdx - ret -word__3d_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - sete bl - mov [r12], rbx - ret -word__21_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setne bl - mov [r12], rbx - ret -word__3c: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setl bl - mov [r12], rbx - ret -word__3e: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setg bl - mov [r12], rbx - ret -word__3c_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setle bl - mov [r12], rbx - ret -word__3e_3d: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - cmp rbx, rax - mov rbx, 0 - setge bl - mov [r12], rbx - ret -word__40: - mov rax, [r12] - mov rax, [rax] - mov [r12], rax - ret -word__21: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - mov [rax], rbx - add r12, 8 - ret -word_mmap: - ; Save rsp and align to 16 bytes for syscall ABI - mov rax, rsp - and rsp, -16 - mov rdi, [r12+40] ; addr - mov rsi, [r12+32] ; length - mov rdx, [r12+24] ; prot - mov r10, [r12+16] ; flags - mov r8, [r12+8] ; fd - mov r9, [r12] ; offset - add r12, 48 ; pop 6 args - mov rax, 9 ; syscall: mmap - syscall - mov rsp, rax ; restore rsp - sub r12, 8 - mov [r12], rax ; push result - ret - ret -word_munmap: - mov rsi, [r12] - add r12, 8 - mov rdi, [r12] - mov rax, 11 - syscall - mov [r12], rax - ret -word_exit: - mov rdi, [r12] - add r12, 8 - mov rax, 60 - syscall - ret -word_and: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - and rcx, rdx - mov [r12], rcx - ret -word_or: - mov rax, [r12] - add r12, 8 - mov rbx, [r12] - test rax, rax - setz cl - test rbx, rbx - setz dl - movzx rcx, cl - movzx rdx, dl - or rcx, rdx - mov [r12], rcx - ret -word_not: - mov rax, [r12] - test rax, rax - setz al - movzx rax, al - mov [r12], rax - ret -word__3er: - mov rax, [r12] - add r12, 8 - sub r13, 8 - mov [r13], rax - ret -word_r_3e: - mov rax, [r13] - add r13, 8 - sub r12, 8 - mov [r12], rax - ret -word_rdrop: - add r13, 8 - ret -word_pick: - mov rcx, [r12] - add r12, 8 - mov rax, [r12 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_rpick: - mov rcx, [r12] - add r12, 8 - mov rax, [r13 + rcx * 8] - sub r12, 8 - mov [r12], rax - ret -word_read_file: - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - add r12, 16 ; pop args - - ; open(path_ptr, O_RDONLY=0, mode=0) - mov rax, 2 ; syscall: open - mov rdi, rsi ; filename - xor rsi, rsi ; flags = O_RDONLY - xor rdx, rdx ; mode = 0 - syscall - mov r10, rax ; save open() result - cmp rax, 0 - jl .fail_open - mov r8, rax ; fd - - ; use lseek to determine file size: lseek(fd, 0, SEEK_END) - mov rax, 8 ; syscall: lseek - mov rdi, r8 ; fd - xor rsi, rsi ; offset = 0 - mov rdx, 2 ; SEEK_END - syscall - mov r11, rax ; save lseek() result - cmp rax, 0 - jl .close_fail_lseek - mov rsi, rax ; length = size - - ; mmap(NULL, size, PROT_READ=1, MAP_PRIVATE=2, fd, 0) - mov rax, 9 ; syscall: mmap - xor rdi, rdi ; addr = NULL - ; rsi already holds length - mov rdx, 1 ; PROT_READ - mov r10, 2 ; MAP_PRIVATE - mov r8, r8 ; fd - xor r9, r9 ; offset = 0 - syscall - mov rbx, rax ; addr - mov r12, r12 ; (no-op, for debug) - mov rax, 3 ; syscall: close - mov rdi, r8 ; fd - syscall - cmp rbx, -4095 - jae .fail_mmap - sub r12, 16 - mov [r12], rsi ; len (rsi held length across syscall) - mov [r12 + 8], rbx ; addr - ret - -.close_fail_lseek: - mov rax, 3 - mov rdi, r8 - syscall - mov rax, r11 ; return lseek() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -1 - ret - -.fail_open: - mov rax, r10 ; return open() error code - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -2 - ret - -.fail_mmap: - mov rax, -1 ; return mmap() error - sub r12, 16 - mov [r12], rax - mov qword [r12 + 8], -3 - ret - ret -word_write_file: - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) - add r12, 32 ; pop 4 args (we saved buf info) - - ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) - mov rdi, rsi ; filename - mov rsi, 577 ; flags = O_WRONLY|O_CREAT|O_TRUNC - mov rdx, 438 ; mode = 0o666 - mov rax, 2 ; syscall: open - syscall - cmp rax, 0 - jl .fail_open - mov r9, rax ; save fd - - ; write(fd, buf_ptr, buf_len) -- use preserved r15/r13 which survive syscalls - mov rax, 1 ; syscall: write - mov rdi, r9 ; fd - mov rsi, r15 ; buf_ptr - mov rdx, r13 ; buf_len - syscall - mov r10, rax ; save write result - cmp r10, 0 - jl .fail_write - - ; close(fd) - mov rax, 3 ; syscall: close - mov rdi, r9 - syscall - - sub r12, 8 - mov [r12], r10 - ret - -.fail_write: - mov rax, 3 - mov rdi, r9 - syscall - sub r12, 8 - mov [r12], r10 - ret - -.fail_open: - sub r12, 8 - mov [r12], rax - ret - ret -word_main: - ; push str_0 - sub r12, 8 - mov qword [r12], str_0 - ; push 27 - sub r12, 8 - mov qword [r12], 27 - call word_swap - ; push str_1 - sub r12, 8 - mov qword [r12], str_1 - ; push 22 - sub r12, 8 - mov qword [r12], 22 - call word_swap - call word_write_file - call word_dup - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word__3e - mov rax, [r12] - add r12, 8 - test rax, rax - jz L_if_false_0 - ; push str_2 - sub r12, 8 - mov qword [r12], str_2 - ; push 13 - sub r12, 8 - mov qword [r12], 13 - call word_puts - call word_puts - ; push 0 - sub r12, 8 - mov qword [r12], 0 - call word_exit -L_if_false_0: - ; push str_3 - sub r12, 8 - mov qword [r12], str_3 - ; push 19 - sub r12, 8 - mov qword [r12], 19 - call word_puts - call word_puts - call word_exit - ret -section .data -data_start: -str_0: db 104, 101, 108, 108, 111, 32, 102, 114, 111, 109, 32, 119, 114, 105, 116, 101, 95, 102, 105, 108, 101, 32, 116, 101, 115, 116, 10, 0 -str_0_len equ 27 -str_1: db 47, 116, 109, 112, 47, 108, 50, 95, 116, 101, 115, 116, 95, 119, 114, 105, 116, 101, 46, 116, 120, 116, 0 -str_1_len equ 22 -str_2: db 119, 114, 111, 116, 101, 32, 98, 121, 116, 101, 115, 58, 32, 0 -str_2_len equ 13 -str_3: db 119, 114, 105, 116, 101, 32, 102, 97, 105, 108, 101, 100, 32, 101, 114, 114, 110, 111, 61, 0 -str_3_len equ 19 -data_end: -section .bss -align 16 -dstack: resb DSTK_BYTES -dstack_top: -align 16 -rstack: resb RSTK_BYTES -rstack_top: -align 16 -print_buf: resb PRINT_BUF_BYTES -print_buf_end: \ No newline at end of file diff --git a/build/test_write_file.o b/build/test_write_file.o deleted file mode 100644 index 1851e6dd7d7519566e86fd925286a3163014d7a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5616 zcmbW4eQaCR6~M3C1l$jBpjB7V{9%wQK2+SqZdGL~kdzj^2hY<`+x=DX=EN_lSI73A zpGhN9L2DK9FxdbViLw=tP^JAb2_XauL5xs`L>;tcoi0vvymRh7 z?<1#4|KLh~@7&)x=iYPA{qTKH?=T)&5{U?}M8tz4sCiU~?m#5DTSP@mh<-m2`@-K% z%)NVw0v|C&8?(C^>gd0eaj{H+-Hh{yZvlN2e%$|O=J%j1-=zLu#Q{RWH2eg97%P^w>Ln8J=CPxy`!;3p5>xX2H-H(>33{Get^A|p z&uc9Gs-AF{Ci8kF`={eN*B%)gFsuhTdgy#MY-L%7Jot0x4`^Wf*wN6Qo2~oQu`rkZlgyIM61n-1Ix78FMFg9 znSX#jJ>$#ai3ZgbTJ!YOO&wbElYh2roo6-oulnq_&zt~o`nfegp*ijFm(>e8#O*AT z#`goBYPoeeyh72qf6(1ahI=~JN}*6T^!nNgD>gR=J0pq4lIkVD-pIFsysSmDvr@pakd#T3m2Pwb{AF=;}~Qune`X z#)mk!u_F!4UC>Kd_sR`)zqx_#jT`7*zk%*ppwsGV@A#v~xLimTtO3nEr`0Zeqt{0g z_uyKI>zLyVJlZn2JTi62c5Sj_43C#stL9Gn69nVjMETm97+WFrl(DUn)Bc^GkHZtO zBcH&!jvYAxoBAaD&T4o5QEt_F@hxPxEU?p1KLOqo!4ku%t9=a%Ylnb7@mTmYw7j7L zRE`E`_;Y_80o;BnI7;N;APw>)8N(A-b7!^AE3i}HNP@!xc4h2^L%?-+Vhm3?!<`2G zIGUnGL!LJ~Gxllo`-#{}m&vD6}(xVCQCB*c%HV)X9m0lLw^f z7W^Ah$p(2H$TK5zGT7^sYfx!|a%MY3KXV5&o0+->ezeJ9RXFK|dcebe=G*^(|JU#c zTg?0zk`e}4G;nyeHsdzP>D7;0AG*G>eFPn7O*o zL_~`59S-Neg`t2{=;0mcW&{&~jB#DC5BF!6U7 zKSX?*@m~@@&-iP^n~c9jd>y-QtNDnCEsV?i8?2w5j89TKCB{z?e~R(H5dRh9=ZJsC z_*cZwGk%5mWyYJt*RhX;o8|Z;;$gxr^-aZ#i5xkbOD~K~9mq{M-uZwvv5Mh@rTR>{l^vkUjrC z-z~X(%=6gebGaaW-M}Ke==1rx8(xIhi1Y7#%wrqu(?v^fHDAbW46X?B0+GyC28CI1 zvbIC7WU*vg`}2Po3>fBh6?$j zWtNJCVMWV!zUY|nQ`KxQS?BTtdC#*@DwU~?{6JAj{rO_PvezUt8C0%XR(-1LP;a$g zRdY7DON-KzmaU}9P?i{6i4-zZU`TQ?PgQvB9DrnqH_4-YELe>)~ zC^NO0NIGYxbDp*{kkfsh0VUl`_l2}pAbWFRdQ&kt=#6f$TJ&X{MAc-rNFA0a9Yt^8 zX4=b;4WhEPgYlO0UOMcMXk~M9?U1=wP4*Q^6}Xnd1=B24EQ=Cp`+BJ#gb`s3&C;vc9k?Xnio7FABrV_d`GsjoBgaVoNI>*Jg*1PZO6eN}cNI*Hf~d^6P0? zPs_S&%7U!sVCO)J)XQ{Wo!E+~mn3S*iiy2MVGwz+=KWE%Kr;jnt H&*T3Czz$G| diff --git a/main.sl b/main.sl index 6861654..61bf6cb 100644 --- a/main.sl +++ b/main.sl @@ -4,10 +4,10 @@ import fn.sl : main 2 40 + - puts + puti cr extend-syntax foo(1, 2) - puts + puti cr 0 ; diff --git a/stdlib/io.sl b/stdlib/io.sl index 8ebdc89..48f0c9c 100644 --- a/stdlib/io.sl +++ b/stdlib/io.sl @@ -1,14 +1,13 @@ - # L2 IO Primitives -# : read_file ( path_ptr path_len -- len addr | 0 0 ) +# : read_file ( path_addr path_len -- addr len | 0 0 ) # Reads the file at the given path (pointer+length, not null-terminated), -# returns (len addr) of mapped file, or (0 0) on error. +# returns (addr len) of mapped file, or (0 0) on error. :asm read_file { - ; stack: path_ptr (top), path_len (next) - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len + ; stack: path_addr (NOS), path_len (TOS) + mov rdx, [r12] ; path_len + mov rsi, [r12 + 8] ; path_addr add r12, 16 ; pop args ; open(path_ptr, O_RDONLY=0, mode=0) @@ -82,11 +81,11 @@ # : write_file ( path_ptr path_len buf_ptr buf_len -- bytes_written | neg_errno ) :asm write_file { - ; stack: path_ptr (top), path_len, buf_ptr, buf_len - mov rsi, [r12] ; path_ptr - mov rdx, [r12 + 8] ; path_len - mov r15, [r12 + 16] ; buf_ptr (save in callee-saved r15) - mov r13, [r12 + 24] ; buf_len (save in callee-saved r13) + ; stack: path_addr, path_len, buf_addr, buf_len (TOS) + mov r13, [r12] ; buf_len + mov r15, [r12 + 8] ; buf_addr + mov rdx, [r12 + 16] ; path_len + mov rsi, [r12 + 24] ; path_addr add r12, 32 ; pop 4 args (we saved buf info) ; open(path_ptr, O_WRONLY|O_CREAT|O_TRUNC, 0666) @@ -133,7 +132,7 @@ } ; -# : read_stdin ( max_len -- len addr | neg_errno 0 ) +# : read_stdin ( max_len -- addr len | neg_errno 0 ) :asm read_stdin { ; stack: max_len mov r14, [r12] ; max_len @@ -192,28 +191,28 @@ } ; -:asm puts { +:asm print { ; detects string if top is len>=0 and next is a pointer in [data_start, data_end] mov rax, [r12] ; len or int value mov rbx, [r12 + 8] ; possible address cmp rax, 0 - jl puts_print_int + jl .print_int lea r8, [rel data_start] lea r9, [rel data_end] cmp rbx, r8 - jl puts_print_int + jl .print_int cmp rbx, r9 - jge puts_print_int + jge .print_int ; treat as string: (addr below len) mov rdx, rax ; len mov rsi, rbx ; addr add r12, 16 ; pop len + addr test rdx, rdx - jz puts_str_newline_only + jz .str_newline_only mov rax, 1 mov rdi, 1 syscall -puts_str_newline_only: +.str_newline_only: mov byte [rel print_buf], 10 mov rax, 1 mov rdi, 1 @@ -221,27 +220,27 @@ puts_str_newline_only: mov rdx, 1 syscall ret -puts_print_int: +.print_int: mov rax, [r12] add r12, 8 mov rbx, rax mov r8, 0 cmp rbx, 0 - jge puts_abs + jge .abs neg rbx mov r8, 1 -puts_abs: +.abs: lea rsi, [rel print_buf_end] mov rcx, 0 mov r10, 10 cmp rbx, 0 - jne puts_digits + jne .digits dec rsi mov byte [rsi], '0' inc rcx - jmp puts_sign -puts_digits: -puts_loop: + jmp .sign +.digits: +.loop: xor rdx, rdx mov rax, rbx div r10 @@ -251,14 +250,14 @@ puts_loop: inc rcx mov rbx, rax test rbx, rbx - jne puts_loop -puts_sign: + jne .loop +.sign: cmp r8, 0 - je puts_finish_digits + je .finish_digits dec rsi mov byte [rsi], '-' inc rcx -puts_finish_digits: +.finish_digits: mov byte [rsi + rcx], 10 inc rcx mov rax, 1 @@ -270,8 +269,9 @@ puts_finish_digits: } ; -# : write_buf ( len addr -- ) +# : write_buf ( addr len -- ) :asm write_buf { + ; data_start (trigger string_mode in compile-time VM) mov rdx, [r12] ; len mov rsi, [r12 + 8] ; addr add r12, 16 ; pop len + addr @@ -280,4 +280,68 @@ puts_finish_digits: syscall ret } -; \ No newline at end of file +; + +# : putc ( char -- ) +:asm putc { + mov rax, [r12] + add r12, 8 + lea rsi, [rel print_buf] + mov [rsi], al + mov rax, 1 + mov rdi, 1 + mov rdx, 1 + syscall + ret +} +; + +# : puti ( int -- ) +:asm puti { + mov rax, [r12] ; get int + add r12, 8 ; pop + mov rbx, rax + mov r8, 0 ; sign flag + cmp rbx, 0 + jge .puti_pos + neg rbx + mov r8, 1 +.puti_pos: + lea rsi, [rel print_buf_end] + mov rcx, 0 + mov r10, 10 + cmp rbx, 0 + jne .puti_digits + dec rsi + mov byte [rsi], '0' + inc rcx + jmp .puti_sign +.puti_digits: +.puti_loop: + xor rdx, rdx + mov rax, rbx + div r10 + add dl, '0' + dec rsi + mov [rsi], dl + inc rcx + mov rbx, rax + test rbx, rbx + jne .puti_loop +.puti_sign: + cmp r8, 0 + je .puti_done + dec rsi + mov byte [rsi], '-' + inc rcx +.puti_done: + mov rax, 1 ; syscall: write + mov rdi, 1 ; fd: stdout + mov rdx, rcx ; length + syscall + ret +} +; + +: cr 10 putc ; +: puts write_buf cr ; diff --git a/str.sl b/str.sl deleted file mode 100644 index d713da5..0000000 --- a/str.sl +++ /dev/null @@ -1,8 +0,0 @@ -import stdlib/stdlib.sl -import stdlib/io.sl - -: main - "str.sl" swap read_file - write_buf - 0 -; \ No newline at end of file diff --git a/t.sl b/t.sl index ff260ce..940b705 100644 --- a/t.sl +++ b/t.sl @@ -4,13 +4,13 @@ import fn.sl fn foo(int a, int b){ 1 - puts + puti cr return a b +; } : main extend-syntax foo(3, 2) - puts + puti cr 0 ; \ No newline at end of file diff --git a/test.sl b/test.sl index 5aed637..bfcb0d7 100644 --- a/test.sl +++ b/test.sl @@ -40,41 +40,41 @@ fn fancy_add(int a, int b){ } : test-add - 5 7 + puts + 5 7 + puti cr ; : test-sub - 10 3 - puts + 10 3 - puti cr ; : test-mul - 6 7 * puts + 6 7 * puti cr ; : test-div - 84 7 / puts + 84 7 / puti cr ; : test-mod - 85 7 % puts + 85 7 % puti cr ; : test-drop - 10 20 drop puts + 10 20 drop puti cr ; : test-dup - 11 dup + puts + 11 dup + puti cr ; : test-swap - 2 5 swap - puts + 2 5 swap - puti cr ; : test-store mem-slot dup 123 swap ! - @ puts + @ puti cr ; @@ -89,33 +89,33 @@ fn fancy_add(int a, int b){ dup 1337 swap ! dup - @ puts + @ puti cr 4096 munmap drop ; : test-macro - 9 square puts - MAGIC puts - add13 puts + 9 square puti cr + MAGIC puti cr + add13 puti cr ; : test-if 5 5 == if - 111 puts + 111 puti cr else - 222 puts + 222 puti cr then ; : test-else-if 2 dup 1 == if - 50 puts + 50 puti cr else dup 2 == if - 60 puts + 60 puti cr else - 70 puts + 70 puti cr then then drop @@ -126,7 +126,7 @@ fn fancy_add(int a, int b){ 5 for 1 + next - puts + puti cr ; : test-for-zero @@ -134,38 +134,38 @@ fn fancy_add(int a, int b){ 0 for drop next - puts + puti cr ; : test-struct mem-slot dup 111 swap Point.x! dup 222 swap Point.y! - dup Point.x@ puts - Point.y@ puts - Point.size puts + dup Point.x@ puti cr + Point.y@ puti cr + Point.size puti cr ; : test-cmp - 5 5 == puts - 5 4 == puts - 5 4 != puts - 4 4 != puts - 3 5 < puts - 5 3 < puts - 5 3 > puts - 3 5 > puts - 5 5 <= puts - 6 5 <= puts - 5 5 >= puts - 4 5 >= puts + 5 5 == puti cr + 5 4 == puti cr + 5 4 != puti cr + 4 4 != puti cr + 3 5 < puti cr + 5 3 < puti cr + 5 3 > puti cr + 3 5 > puti cr + 5 5 <= puti cr + 6 5 <= puti cr + 5 5 >= puti cr + 4 5 >= puti cr ; : test-c-fn 3 7 fancy_add() - puts + puti cr ; : main diff --git a/test_read_file.sl b/test_read_file.sl index 98ed46d..261c820 100644 --- a/test_read_file.sl +++ b/test_read_file.sl @@ -2,9 +2,8 @@ import stdlib/stdlib.sl import stdlib/io.sl : main - "/etc/hostname" # (len addr) - swap # (addr len) - read_file # (file_len file_addr) + "/etc/hostname" # (addr len) + read_file # (file_addr file_len) dup 0 > if # if file_len > 0, success write_buf # print file contents (file_len file_addr) 0 @@ -13,13 +12,13 @@ import stdlib/io.sl dup -2 == if # open() failed drop "open() failed: errno=" puts - swap puts + swap puti cr exit then dup -1 == if # fstat() failed drop "fstat() failed: errno=" puts - swap puts + swap puti cr exit then dup -3 == if # mmap() failed diff --git a/test_read_stdin.sl b/test_read_stdin.sl index 25d81f6..4496017 100644 --- a/test_read_stdin.sl +++ b/test_read_stdin.sl @@ -3,7 +3,7 @@ import stdlib/io.sl : main 1024 - read_stdin # returns (len addr) + read_stdin # returns (addr len) dup 0 > if write_buf 0 exit diff --git a/test_write_file.sl b/test_write_file.sl index 7e1c29a..fa3db19 100644 --- a/test_write_file.sl +++ b/test_write_file.sl @@ -2,18 +2,16 @@ import stdlib/stdlib.sl import stdlib/io.sl : main - "hello from write_file test\n" # push buf (len addr) - swap # -> (addr len) = buf_ptr buf_len - "/tmp/l2_test_write.txt" # push path (len addr) - swap # -> (addr len) = path_ptr path_len + "/tmp/l2_test_write.txt" # push path (addr len) + "hello from write_file test\n" # push buf (addr len) write_file dup 0 > if "wrote bytes: " puts - puts + puti cr 0 exit then "write failed errno=" puts - puts + puti cr exit -; +; \ No newline at end of file diff --git a/tests/run_tests.py b/tests/run_tests.py index 662e139..452ddbb 100644 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -36,10 +36,10 @@ import {ROOT / 'fn.sl'} : main 2 40 + - puts + puti cr extend-syntax foo(1, 2) - puts + puti cr 0 ; @@ -60,9 +60,9 @@ import {ROOT / 'stdlib/io.sl'} 5 for 1 + next - puts - 5 5 == puts - 5 4 == puts + puti cr + 5 5 == puti cr + 5 4 == puti cr 0 ; """, @@ -96,7 +96,7 @@ compile-only : main emit-overridden - puts + puti cr 0 ; """,