]> rethought.computer Git - sorel-lang.git/commitdiff
add argc and argv to the stack at startup
authorBryan English <bryan@rethought.computer>
Sat, 21 Feb 2026 21:22:41 +0000 (16:22 -0500)
committerBryan English <bryan@rethought.computer>
Sat, 21 Feb 2026 21:23:29 +0000 (16:23 -0500)
sorel-codegen/src/riscv64_asm.rs
tests/test.sh
tests/test2.sorel [new file with mode: 0644]

index 692eca0154dc2f6cb88563fde9911617a9590cdf..4b2f27253c0aae6e728f95db46dd396829e627b2 100644 (file)
@@ -142,11 +142,16 @@ impl<'a> CodeGen<'a> {
                         self.label(".globl _start"); // TODO is globl necessary?
                         self.label("_start:");
                         self.line("la s2, data_stack_end # set initial data stack pointer");
+                        self.line("ld t0, 0(sp)   # t0 = argc");
+                        self.line("addi t1, sp, 8 # t1 = argv");
+                        self.push_from("t0");
+                        self.push_from("t1");
                     } else {
                         let mangled = mangle(name);
                         self.label(format!(".globl {}", mangled));
                         self.label(format!("{}:", mangled));
                     }
+
                     self.line("addi sp, sp, -16 # allocate 16 bytes on stack"); // allocate 16 bytes on stack
                     self.line("sd ra, 8(sp) # store return address on stack");   // store return address on stack
                 },
index ab7a14550a5e70d03885df622ec67cd65c8ea286..e239f873ba5f099ecd07822032b22a10c2134a58 100644 (file)
@@ -8,3 +8,8 @@ CC="${CMD_PREFIX}cc"
 $AS -g -o test1.o test1.asm
 $LD -o test1.out test1.o
 ./test1.out
+
+../target/debug/sorelc test2.sorel
+$AS -g -o test2.o test2.asm
+$LD -o test2.out test2.o
+./test2.out
diff --git a/tests/test2.sorel b/tests/test2.sorel
new file mode 100644 (file)
index 0000000..0ff5b41
--- /dev/null
@@ -0,0 +1,17 @@
+\ vim: filetype=forth
+
+import "std:out"
+
+swap \ ( argv argc )
+dup \ ( argv argc argc )
+loop \ ( argv argc )
+  swap \ ( argc argv )
+  dup \ ( argc argv argv )
+  @ \ ( argc argv addr-to-arg-str )
+  puts " " puts drop
+  drop \ ( argc argv )
+  8 + \ ( argc argv+8 )
+  swap \ ( argv+8 argc )
+  1 - \ ( argv+8 argc-1 )
+  dup  \ ( argv+8 argc-1 argc-1 )
+endloop