about summary refs log tree commit diff stats
path: root/subx/052kernel-string-equal.subx
diff options
context:
space:
mode:
Diffstat (limited to 'subx/052kernel-string-equal.subx')
-rw-r--r--subx/052kernel-string-equal.subx54
1 files changed, 31 insertions, 23 deletions
diff --git a/subx/052kernel-string-equal.subx b/subx/052kernel-string-equal.subx
index b61c3303..840b4460 100644
--- a/subx/052kernel-string-equal.subx
+++ b/subx/052kernel-string-equal.subx
@@ -30,19 +30,26 @@
 # reason for the name: the only place we should have null-terminated ascii strings is from commandline args
 kernel-string-equal?:  # s : null-terminated ascii string, benchmark : length-prefixed ascii string -> EAX : boolean
     # pseudocode:
-    #   initialize n = b->length
-    #   initialize s1 = s
-    #   initialize s2 = b->data
+    #   n = benchmark->length
+    #   s1 = s
+    #   s2 = benchmark->data
     #   i = 0
-    #   for (i = 0; i < n; ++n)
+    #   while (i < n)
     #     c1 = *s1
     #     c2 = *s2
-    #     if c1 == 0
-    #       return false
-    #     if c1 != c2
-    #       return false
+    #     if (c1 == 0) return false
+    #     if (c1 != c2) return false
+    #     ++s1, ++s2, ++i
     #   return *s1 == 0
     #
+    # registers:
+    #   i: ECX
+    #   n: EDX
+    #   s1: EDI
+    #   s2: ESI
+    #   c1: EAX
+    #   c2: EBX
+    #
     # . prolog
     55/push-EBP
     89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
@@ -52,24 +59,25 @@ kernel-string-equal?:  # s : null-terminated ascii string, benchmark : length-pr
     53/push-EBX
     56/push-ESI
     57/push-EDI
-    # initialize s into EDI
+    # s1/EDI = s
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           7/r32/EDI   8/disp8         .                 # copy *(EBP+8) to EDI
-    # initialize benchmark length n into EDX
+    # n/EDX = benchmark->length
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           2/r32/EDX   0xc/disp8       .                 # copy *(EBP+12) to EDX
     8b/copy                         0/mod/indirect  2/rm32/EDX    .           .             .           2/r32/EDX   .               .                 # copy *EDX to EDX
-    # initialize benchmark data into ESI
+    # s2/ESI = benchmark->data
     8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           6/r32/ESI   0xc/disp8       .                 # copy *(EBP+12) to ESI
     81          0/subop/add         3/mod/direct    6/rm32/ESI    .           .             .           .           .               4/imm32           # add to ESI
-    # initialize loop counter i into ECX
+    # i/ECX = c1/EAX = c2/EBX = 0
     b9/copy-to-ECX  0/imm32/exit
-    # while (i/ECX < n/EDX)
+    b8/copy-to-EAX  0/imm32
+    bb/copy-to-EBX  0/imm32
 $kernel-string-equal?:loop:
+    # if (i >= n) break
     39/compare                      3/mod/direct    1/rm32/ECX    .           .             .           2/r32/EDX   .               .                 # compare ECX with EDX
-    74/jump-if-equal  $kernel-string-equal?:break/disp8
-    # c1/EAX, c2/EBX = *s, *benchmark
-    b8/copy-to-EAX  0/imm32
+    7d/jump-if-greater-or-equal  $kernel-string-equal?:break/disp8
+    # c1 = *s1
     8a/copy                         0/mod/indirect  7/rm32/EDI    .           .             .           0/r32/EAX   .               .                 # copy byte at *EDI to lower byte of EAX
-    bb/copy-to-EBX  0/imm32
+    # c2 = *s2
     8a/copy                         0/mod/indirect  6/rm32/ESI    .           .             .           3/r32/EBX   .               .                 # copy byte at *ESI to lower byte of EBX
     # if (c1 == 0) return false
     3d/compare-EAX  0/imm32
@@ -77,22 +85,21 @@ $kernel-string-equal?:loop:
     # if (c1 != c2) return false
     39/compare                      3/mod/direct    0/rm32/EAX    .           .             .           3/r32/EBX   .               .                 # compare EAX with EBX
     75/jump-if-not-equal  $kernel-string-equal?:false/disp8
-    # ++s1, ++s2, ++i
+    # ++i
     41/inc-ECX
-    46/inc-ESI
+    # ++s1
     47/inc-EDI
-    # end while
+    # ++s2
+    46/inc-ESI
     eb/jump  $kernel-string-equal?:loop/disp8
 $kernel-string-equal?:break:
-    # if (*s/EDI == 0) return true
-    b8/copy-to-EAX  0/imm32
+    # return *s1 == 0
     8a/copy                         0/mod/indirect  7/rm32/EDI    .           .             .           0/r32/EAX   .               .                 # copy byte at *EDI to lower byte of EAX
     3d/compare-EAX  0/imm32
     75/jump-if-not-equal  $kernel-string-equal?:false/disp8
 $kernel-string-equal?:true:
     b8/copy-to-EAX  1/imm32
     eb/jump  $kernel-string-equal?:end/disp8
-    # return false
 $kernel-string-equal?:false:
     b8/copy-to-EAX  0/imm32
 $kernel-string-equal?:end:
@@ -253,6 +260,7 @@ test-compare-kernel-string-with-longer-array:
 
 Null-kernel-string:
     00/null
+
 _test-Abc-kernel-string:
     41/A 62/b 63/c 00/null