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
},
$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
--- /dev/null
+\ 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