about summary refs log tree commit diff stats
path: root/transect/ex8.k2
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-09-23 09:23:21 -0700
committerKartik Agaram <vc@akkartik.com>2018-09-23 09:23:21 -0700
commitaa00959024643a33f766ef3f060a934006fe7725 (patch)
treef73a6ade8937c70a4df6b480ac8602e21ae1d7d3 /transect/ex8.k2
parent7d4e351a0d1e3c4e71b58d3218b4e6b833f542f2 (diff)
downloadmu-aa00959024643a33f766ef3f060a934006fe7725.tar.gz
4504
Diffstat (limited to 'transect/ex8.k2')
-rw-r--r--transect/ex8.k236
1 files changed, 36 insertions, 0 deletions
diff --git a/transect/ex8.k2 b/transect/ex8.k2
new file mode 100644
index 00000000..dfef03b0
--- /dev/null
+++ b/transect/ex8.k2
@@ -0,0 +1,36 @@
+# Example reading commandline arguments: compute length of first arg.
+
+fn main argc : int, argv : (array (ref array char)) -> [
+  var tmp : (index char)
+  tmp <- index 1, %size(ref array char)
+  var tmp2 : (address (ref array char))
+  tmp2 <- advance argv, tmp
+  var s/EBX : (ref array char)
+  s/EBX <- copy *tmp2
+  var result/EAX : int
+  result/EAX <- ascii_length s/EBX
+  call exit, result/EAX
+]
+
+fn ascii_length s : (ref array char) -> result : int [
+  var result/EBX : int
+  result/EBX <- copy 0
+  {
+    var tmp0/EDI : (offset char)
+    tmp0/EDI <- index result/EBX, %size(char)
+    var tmp/EDX : (address char)
+    tmp/EDX <- advance *s, tmp0/EDI
+    var c/ECX : char
+    c/ECX <- copy *tmp
+    compare c/ECX, 0
+    break-if-equal
+    loop
+  }
+  return result/EBX
+]
+
+fn exit x : int [
+  code/EBX <- copy x
+  code/EAX <- copy 1/exit
+  syscall
+]
a id='n180' href='#n180'>180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220