about summary refs log tree commit diff stats
path: root/subx/054string-equal.subx
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-02-14 16:24:20 -0800
committerKartik Agaram <vc@akkartik.com>2019-02-14 16:24:20 -0800
commit1639687ba098aa81b0584f7dd609cb9690dc5a04 (patch)
tree1a5ee40c30bf906c6ba5e55b8c5138a467022105 /subx/054string-equal.subx
parent1ab48a69ccfa4ddaa2e1fa803ea6fe568b890abc (diff)
downloadmu-1639687ba098aa81b0584f7dd609cb9690dc5a04.tar.gz
4961
Diffstat (limited to 'subx/054string-equal.subx')
-rw-r--r--subx/054string-equal.subx43
1 files changed, 25 insertions, 18 deletions
diff --git a/subx/054string-equal.subx b/subx/054string-equal.subx
index fdfca84e..f69c0c0f 100644
--- a/subx/054string-equal.subx
+++ b/subx/054string-equal.subx
@@ -13,18 +13,27 @@
     b8/copy-to-EAX  1/imm32/exit
     cd/syscall  0x80/imm8
 
-string-equal?:  # s : string, benchmark : string -> EAX : boolean
+string-equal?:  # s : (address string), benchmark : (address string) -> EAX : boolean
     # pseudocode:
-    #   if s->length != b->length return false
-    #   for i = 0;  i < s->length;  ++i
-    #     if s[i] != b[i] return false
+    #   lens = s->length
+    #   if (lens != benchmark->length) return false
+    #   i = 0
+    #   currs = s->data
+    #   currb = benchmark->data
+    #   while (i < s->length)
+    #     c1 = *currs
+    #     c2 = *currb
+    #     if (c1 != c2) return false
+    #     ++i, ++currs, ++currb
     #   return true
+    #
     # registers:
     #   i: ECX
-    #   s->length: EDX
-    #   b->length: EBX
-    #   b[i]: EBX
-    #   s[i]: EAX
+    #   lens: EDX
+    #   currs: EAX
+    #   currb: EBX
+    #   c1: ESI
+    #   c2: EDI
     #
     # . prolog
     55/push-EBP
@@ -34,17 +43,16 @@ string-equal?:  # s : string, benchmark : string -> EAX : boolean
     52/push-EDX
     53/push-EBX
     56/push-ESI
-    # var s/EAX : (address array byte)
+    # EAX = s
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           0/r32/EAX   8/disp8         .                 # copy *(EBP+8) to EAX
-    # var benchmark/EBX : (address array byte)
+    # EBX = benchmark
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           3/r32/EBX   0xc/disp8       .                 # copy *(EBP+12) to EBX
-    # if s->length != b->length return false
-    # EDX = s->length
+    # lens/EDX = s->length
     8b/copy                         0/mod/indirect  0/rm32/EAX    .           .             .           2/r32/EDX   .               .                 # copy *EAX to EDX
-    # compare s->length and b->length
+$string-equal?:lengths:
+    # if (lens != benchmark->length) return false
     39/compare                      0/mod/indirect  3/rm32/EBX    .           .             .           2/r32/EDX   .               .                 # compare *EBX with EDX
     75/jump-if-not-equal  $string-equal?:false/disp8
-$string-equal?:lengths:
     # var i/ECX : int = 0
     b9/copy-to-ECX  0/imm32
     # EBX = &b[i]
@@ -52,7 +60,7 @@ $string-equal?:lengths:
     # EAX = &s[i]
     40/inc-EAX
 $string-equal?:loop:
-    # if i >= s->length return true
+    # if (i >= lens) return true
     39/compare                      3/mod/direct    1/rm32/ECX    .           .             .           2/r32/EDX   .               .                 # compare ECX with EDX
     7d/jump-if-greater-or-equal  $string-equal?:true/disp8
     # if b[i] != s[i] return false
@@ -63,16 +71,15 @@ $string-equal?:loop:
     75/jump-if-not-equal  $string-equal?:false/disp8
     # ++i
     41/inc-ECX
+    # ++c1
     40/inc-EAX
+    # ++c2
     43/inc-EBX
-    # loop
     eb/jump  $string-equal?:loop/disp8
 $string-equal?:true:
-    # return true
     b8/copy-to-EAX  1/imm32
     eb/jump  $string-equal?:end/disp8
 $string-equal?:false:
-    # return false
     b8/copy-to-EAX  0/imm32
 $string-equal?:end:
     # . restore registers