diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-03-15 21:03:12 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-03-15 21:03:12 -0700 |
commit | c48ce3c8bfb6d1578f2530ed84b8e7b25d435b6d (patch) | |
tree | 9a7b23b95d9960853aad1be4e6e95b12f300ade8 /mu-init.subx | |
parent | f559236bdf9103c5f88d8dfc098f3afe3de64e4a (diff) | |
download | mu-c48ce3c8bfb6d1578f2530ed84b8e7b25d435b6d.tar.gz |
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.
Diffstat (limited to 'mu-init.subx')
-rw-r--r-- | mu-init.subx | 45 |
1 files changed, 38 insertions, 7 deletions
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) |