From c48ce3c8bfb6d1578f2530ed84b8e7b25d435b6d Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sun, 15 Mar 2020 21:03:12 -0700 Subject: 6153 - switch 'main' to use Mu strings At the SubX level we have to put up with null-terminated kernel strings for commandline args. But so far we haven't done much with them. Rather than try to support them we'll just convert them transparently to standard length-prefixed strings. In the process I realized that it's not quite right to treat the combination of argc and argv as an array of kernel strings. Argc counts the number of elements, whereas the length of an array is usually denominated in bytes. --- mu-init.subx | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'mu-init.subx') diff --git a/mu-init.subx b/mu-init.subx index fb15efbf..2377822e 100644 --- a/mu-init.subx +++ b/mu-init.subx @@ -3,7 +3,7 @@ # See translate_mu for how this file is used. # # Mu programs start at a function called 'main' with this signature: -# fn main args: (addr array kernel-string) -> exit-status/ebx: int +# fn main args: (addr array (addr array byte)) -> exit-status/ebx: int # If your program doesn't need commandline arguments you can drop it: # fn main -> exit-status/ebx: int # @@ -15,11 +15,42 @@ Entry: # we don't use ebp in Entry; just initialize it bd/copy-to-ebp 0/imm32 - # var args/eax: (addr array kernel-string) - 89/<- %eax 4/r32/esp - # initialize the heap + # - save argc and argv + # var argc-and-argv/esi + 89/<- %esi 4/r32/esp +$Entry:initialize-heap: + # - initialize the heap (new-segment *Heap-size Heap) - # run Mu program - (main %eax) - # exit +$Entry:initialize-args: + # - convert argv from null-terminated 'kernel' strings to length-prefixed Mu strings + # var argc/edx: int + 8b/-> *esi 2/r32/edx + # argc is in words; convert it to bytes + c1/shift 4/subop/left %edx 2/imm8 + # var args/edi: (addr array (addr array byte)) + (allocate-array Heap %edx) # => eax + 89/<- %edi 0/r32/eax + # var curr/ecx: (addr kernel-string) = argv + 8d/copy-address *(esi+4) 1/r32/ecx + # var max/edx: (addr kernel-string) = argv+4+argc + 8d/copy-address *(ecx+edx) 2/r32/edx + # var dest/esi: (addr (addr array byte)) = args+4 + 8d/copy-address *(edi+4) 6/r32/esi + { + # if (curr >= max) break + 39/compare %ecx 2/r32/edx + 73/jump-if-addr>= break/disp8 + # *dest = kernel-string-to-string(*curr) + (kernel-string-to-string Heap *ecx) # => eax + 89/<- *esi 0/r32/eax + # curr += 4 + 81 0/subop/add %ecx 4/imm32 + # dest += 4 + 81 0/subop/add %esi 4/imm32 + # + eb/jump loop/disp8 + } + # - run Mu program + (main %edi) # => ebx + # - exit (syscall_exit) -- cgit 1.4.1-2-gfad0