From 705dfd8587fab7d850163a3bbbca5075724ad946 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 15 Jun 2020 19:37:07 -0700 Subject: 6534 - arith: add/subtract --- apps/arith.mu | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'apps/arith.mu') diff --git a/apps/arith.mu b/apps/arith.mu index 09e464cd..2f41c5cd 100644 --- a/apps/arith.mu +++ b/apps/arith.mu @@ -20,19 +20,53 @@ fn main -> exit-status/ebx: int { } fn simplify -> result/eax: int, look/esi: byte { +$simplify:body: { look <- get-char # prime the pump # first arg look <- skip-spaces look { - var is-digit?/eax: boolean <- is-decimal-digit? look - compare is-digit?, 0 # false - break-if-= + { + var is-digit?/eax: boolean <- is-decimal-digit? look + compare is-digit?, 0 # false + break-if-= $simplify:body + } result, look <- num look } + # operator + var op/ecx: byte <- copy 0 + look <- skip-spaces look + op, look <- operator look + # second arg + var second/edx: int <- copy 0 + look <- skip-spaces look + { + var tmp/eax: int <- copy 0 + tmp, look <- num look + second <- copy tmp + } + # perform op + { + compare op, 0x2b # '+' + break-if-!= + result <- add second + break $simplify:body + } + { + compare op, 0x2d # '-' + break-if-!= + result <- subtract second + break $simplify:body + } +} # $simplify:body # trailing spaces look <- skip-spaces look } +fn operator _look: byte -> op/ecx: byte, look/esi: byte { + op <- copy _look + look <- get-char +} + fn num _look: byte -> result/eax: int, look/esi: byte { look <- copy _look # should be a no-op; guaranteed to be a digit var out/edi: int <- copy 0 -- cgit 1.4.1-2-gfad0