added argv and argc interaction

This commit is contained in:
IgorCielniak
2025-12-25 22:37:04 +01:00
parent f76ef276e9
commit 7d6c1fb0d3
3 changed files with 72 additions and 0 deletions

10
args.sl Normal file
View File

@@ -0,0 +1,10 @@
import stdlib/stdlib.sl
import stdlib/io.sl
: main
0 argc for
dup
argv@ dup strlen puts
1 +
next
;

11
main.py
View File

@@ -1754,7 +1754,18 @@ class Assembler:
"%define RSTK_BYTES 65536", "%define RSTK_BYTES 65536",
"%define PRINT_BUF_BYTES 128", "%define PRINT_BUF_BYTES 128",
"global _start", "global _start",
"global argc",
"global argv",
"section .data",
"argc: dq 0",
"argv: dq 0",
"section .text",
"_start:", "_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", " ; initialize data/return stack pointers",
" lea r12, [rel dstack_top]", " lea r12, [rel dstack_top]",
" mov r15, r12", " mov r15, r12",

View File

@@ -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 ) # : c@ ( addr -- byte )
:asm c@ { :asm c@ {
mov rax, [r12] ; get address from stack mov rax, [r12] ; get address from stack