From 7d6c1fb0d3d1b9d02cbb42a5014a5531cdebd8a9 Mon Sep 17 00:00:00 2001 From: IgorCielniak Date: Thu, 25 Dec 2025 22:37:04 +0100 Subject: [PATCH] added argv and argc interaction --- args.sl | 10 ++++++++++ main.py | 11 +++++++++++ stdlib/stdlib.sl | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 args.sl diff --git a/args.sl b/args.sl new file mode 100644 index 0000000..259615b --- /dev/null +++ b/args.sl @@ -0,0 +1,10 @@ +import stdlib/stdlib.sl +import stdlib/io.sl + +: main + 0 argc for + dup + argv@ dup strlen puts + 1 + + next +; \ No newline at end of file diff --git a/main.py b/main.py index 8a5b631..10118db 100644 --- a/main.py +++ b/main.py @@ -1754,7 +1754,18 @@ class Assembler: "%define RSTK_BYTES 65536", "%define PRINT_BUF_BYTES 128", "global _start", + "global argc", + "global argv", + "section .data", + "argc: dq 0", + "argv: dq 0", + "section .text", "_start:", + " ; Linux x86-64 startup: argc/argv from stack", + " mov rdi, [rsp]", # argc + " lea rsi, [rsp+8]", # argv + " mov [rel argc], rdi", + " mov [rel argv], rsi", " ; initialize data/return stack pointers", " lea r12, [rel dstack_top]", " mov r15, r12", diff --git a/stdlib/stdlib.sl b/stdlib/stdlib.sl index 6a70154..0a26c6c 100644 --- a/stdlib/stdlib.sl +++ b/stdlib/stdlib.sl @@ -1,3 +1,54 @@ +# : strlen ( addr -- len ) +# for null terminated strings + +:asm strlen { + mov rsi, [r12] ; address + xor rcx, rcx ; length counter +.strlen_loop: + mov al, [rsi] + test al, al + jz .strlen_done + inc rcx + inc rsi + jmp .strlen_loop +.strlen_done: + mov rax, rcx + mov [r12], rax ; store length on stack + ret +} +; + +# : argc ( -- n ) +:asm argc { + extern argc + mov rax, [rel argc] + sub r12, 8 + mov [r12], rax + ret +} +; + +# : argv ( -- ptr ) +:asm argv { + extern argv + mov rax, [rel argv] + sub r12, 8 + mov [r12], rax + ret +} +; + +# : argv@ ( n -- ptr ) +:asm argv@ { + extern argv + mov rbx, [r12] ; n + mov rax, [rel argv] + mov rax, [rax + rbx*8] + mov [r12], rax + ret +} +; + # : c@ ( addr -- byte ) :asm c@ { mov rax, [r12] ; get address from stack