diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-06-14 00:24:47 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-06-14 00:28:23 -0700 |
commit | ad61776f498e8117756e4794eac840fab60cfac6 (patch) | |
tree | 73510284e749eab8c207aecef90084d0a5c57101 /apps/parse-int.mu | |
parent | ead3d08e774529f3026f8cd6f93b8a0d7c87ed08 (diff) | |
download | mu-ad61776f498e8117756e4794eac840fab60cfac6.tar.gz |
6520 - new app: parse-int
Several bugs fixed in the process, and expectation of further bugs is growing. I'd somehow started assuming I don't need to have separate cases for rm32 as a register vs mem. That's not right. We might need more reg-reg Primitives.
Diffstat (limited to 'apps/parse-int.mu')
-rw-r--r-- | apps/parse-int.mu | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/apps/parse-int.mu b/apps/parse-int.mu new file mode 100644 index 00000000..c9c1d945 --- /dev/null +++ b/apps/parse-int.mu @@ -0,0 +1,50 @@ +# parse a decimal int at the commandline +# +# To run: +# $ ./translate_mu apps/parse-int.mu +# $ ./a.elf 123 +# $ echo $? +# 123 + +fn main _args: (addr array (addr array byte)) -> exit-status/ebx: int { +$main-body: { + # if no args, print a message and exit + var args/esi: (addr array (addr array byte)) <- copy _args + var n/ecx: int <- length args + compare n, 1 + { + break-if-> + print-string "usage: parse-int <integer>\n" + exit-status <- copy 1 + break $main-body + } + # otherwise parse the first arg as an integer + var in/ecx: (addr addr array byte) <- index args, 1 + var out/eax: int <- parse-int *in + exit-status <- copy out +} +} + +fn parse-int _in: (addr array byte) -> result/eax: int { + var in/esi: (addr array byte) <- copy _in + var len/edx: int <- length in + var i/ecx: int <- copy 0 + var out/edi: int <- copy 0 + { + compare i, len + break-if->= + # out *= 10 + var ten/eax: int <- copy 0xa + out <- multiply ten + # c = in[i] + var tmp/ebx: (addr byte) <- index in, i + var c/eax: byte <- copy 0 + c <- copy-byte *tmp + # + var digit/eax: int <- to-decimal-digit c + out <- add digit + i <- increment + loop + } + result <- copy out +} |