added argv and argc interaction
This commit is contained in:
10
args.sl
Normal file
10
args.sl
Normal 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
11
main.py
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user