about summary refs log tree commit diff stats
path: root/subx/examples
diff options
context:
space:
mode:
Diffstat (limited to 'subx/examples')
-rw-r--r--subx/examples/ex11bin1034 -> 1062 bytes
-rw-r--r--subx/examples/ex11.subx50
2 files changed, 41 insertions, 9 deletions
diff --git a/subx/examples/ex11 b/subx/examples/ex11
index 646c2eb7..d68fd5ad 100644
--- a/subx/examples/ex11
+++ b/subx/examples/ex11
Binary files differdiff --git a/subx/examples/ex11.subx b/subx/examples/ex11.subx
index 86b7e8b4..8c2c9625 100644
--- a/subx/examples/ex11.subx
+++ b/subx/examples/ex11.subx
@@ -29,6 +29,16 @@
 # compare a null-terminated ascii string with a more idiomatic length-prefixed byte array
 # reason for the name: the only place we should have null-terminated ascii strings is from commandline args
 argv_equal:  # s : null-terminated ascii string, benchmark : length-prefixed ascii string -> EAX : boolean
+  # prolog
+  55/push-EBP
+  89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
+  # save registers
+  51/push-ECX
+  52/push-EDX
+  53/push-EBX
+  56/push-ESI
+  57/push-EDI
+
   # pseudocode:
   #   initialize n = b.length
   #   initialize s1 = s
@@ -42,14 +52,13 @@ argv_equal:  # s : null-terminated ascii string, benchmark : length-prefixed asc
   #     if c1 != c2
   #       return false
   #   return *s1 == 0
-
   # initialize s into EDI
-  8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           7/r32/EDI   4/disp8         .                 # copy *(ESP+4) to EDI
+  8b/copy                         1/mod/*+disp8   4/rm32/sib    5/base/EBP  4/index/none  .           7/r32/EDI   8/disp8         .                 # copy *(EBP+8) to EDI
   # initialize benchmark length n into EDX
-  8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           2/r32/EDX   8/disp8         .                 # copy *(ESP+8) to EDX
+  8b/copy                         1/mod/*+disp8   4/rm32/sib    5/base/EBP  4/index/none  .           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
-  8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           6/r32/ESI   8/disp8         .                 # copy *(ESP+8) to ESI
+  8b/copy                         1/mod/*+disp8   4/rm32/sib    5/base/EBP  4/index/none  .           6/r32/ESI   0xc/disp8       .                 # copy *(EBP+12) to ESI
   81          0/subop/add         3/mod/direct    6/rm32/ESI    .           .             .           .           .               4/imm32           # add 4 to ESI
   # initialize loop counter i into ECX
   b9/copy                         .               .             .           .             .           .           .               0/imm32/exit      # copy 1 to ECX
@@ -81,10 +90,21 @@ $argv_break:
   81          7/subop/compare     3/mod/direct    0/rm32/EAX    .           .             .           .           .               0/imm32           # compare EAX with 0
   75/jump-if-not-equal  $argv_fail/disp8
   b8/copy                         .               .             .           .             .           .           .               1/imm32           # copy 1 to EAX
-  c3/return
+  eb/jump  $argv_end/disp8
   # return false
 $argv_fail:
   b8/copy                         .               .             .           .             .           .           .               0/imm32           # copy 0 to EAX
+
+$argv_end:
+  # restore registers
+  5f/pop-to-EDI
+  5e/pop-to-ESI
+  5b/pop-to-EBX
+  5a/pop-to-EDX
+  59/pop-to-ECX
+  # end
+  89/copy                         3/mod/direct    4/rm32/ESP    .           .             .           5/r32/EBP   .               .                 # copy EBP to ESP
+  5d/pop-to-EBP
   c3/return
 
 ## tests
@@ -233,9 +253,15 @@ test_compare_argv_with_longer_array:
 
 # print msg to stderr if a != b, otherwise print "."
 check_ints_equal:  # (a : int, b : int, msg : (address array byte)) -> boolean
+  # prolog
+  55/push-EBP
+  89/copy                         3/mod/direct    5/rm32/EBP    .           .             .           4/r32/ESP   .               .                 # copy ESP to EBP
+  # save registers
+  51/push-ECX
+  53/push-EBX
   # load args into EAX, EBX and ECX
-  8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           0/r32/EAX   0x4/disp8       .                 # copy *(ESP+4) to EAX
-  8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           3/r32/EBX   0x8/disp8       .                 # copy *(ESP+8) to EBX
+  8b/copy                         1/mod/*+disp8   4/rm32/sib    5/base/EBP  4/index/none  .           0/r32/EAX   0x8/disp8       .                 # copy *(EBP+8) to EAX
+  8b/copy                         1/mod/*+disp8   4/rm32/sib    5/base/EBP  4/index/none  .           3/r32/EBX   0xc/disp8       .                 # copy *(EBP+12) to EBX
   # if EAX == b/EBX
   39/compare                      3/mod/direct    0/rm32/EAX    .           .             .           3/r32/EBX   .               .                 # compare EAX and EBX
   75/jump-if-unequal  $check_ints_equal:else/disp8
@@ -247,11 +273,11 @@ check_ints_equal:  # (a : int, b : int, msg : (address array byte)) -> boolean
       # discard arg
   81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add 4 to ESP
     # return
-  c3/return
+  eb/jump  $check_ints_equal:end/disp8
   # else:
 $check_ints_equal:else:
   # copy msg into ECX
-  8b/copy                         1/mod/*+disp8   4/rm32/sib    4/base/ESP  4/index/none  .           1/r32/ECX   0xc/disp8       .                 # copy *(ESP+12) to ECX
+  8b/copy                         1/mod/*+disp8   4/rm32/sib    5/base/EBP  4/index/none  .           1/r32/ECX   0x10/disp8       .                # copy *(EBP+16) to ECX
     # print(ECX)
       # push args
   51/push-ECX
@@ -266,7 +292,13 @@ $check_ints_equal:else:
   e8/call  write_stderr/disp32
       # discard arg
   81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add 4 to ESP
+$check_ints_equal:end:
+  # restore registers
+  5b/pop-to-EBX
+  59/pop-to-ECX
   # end
+  89/copy                         3/mod/direct    4/rm32/ESP    .           .             .           5/r32/EBP   .               .                 # copy EBP to ESP
+  5d/pop-to-EBP
   c3/return
 
 write_stderr:  # s : (address array byte) -> <void>
eply@github.com> 2021-03-12 15:45:51 +0100 use NIM_TESTAMENT_BATCH for important_packages, improve formatting, code cleanups (#17301)' href='/ahoang/Nim/commit/testament/important_packages.nim?h=devel&id=c6f9c38892a6351d2bfd0c796bbb6b10b3a68a96'>c6f9c3889 ^
6a355a4db ^
c6f9c3889 ^






66890c3ad ^
93c8427fc ^
c6f9c3889 ^


a8611c665 ^
6a355a4db ^
3645f5fc7 ^
c6f9c3889 ^




19bcb43a0 ^
c6f9c3889 ^




6a355a4db ^
c6f9c3889 ^

1df0c04a1 ^
c6f9c3889 ^
66890c3ad ^
c6f9c3889 ^
23e10ea85 ^
c6f9c3889 ^

9e6f2d7d1 ^
c6f9c3889 ^
45490497e ^
c6f9c3889 ^
3645f5fc7 ^
c6f9c3889 ^
eb0b323f4 ^
c6f9c3889 ^




19bcb43a0 ^
3645f5fc7 ^
6a355a4db ^
c6f9c3889 ^





23e10ea85 ^
270964c48 ^
c6f9c3889 ^


6a355a4db ^

c6f9c3889 ^
15d956695 ^
c6f9c3889 ^



6a355a4db ^
66890c3ad ^
b2edc3468 ^
c6f9c3889 ^





1421a3bf2 ^
c6f9c3889 ^














3645f5fc7 ^
c6f9c3889 ^



3645f5fc7 ^
c6f9c3889 ^
23e10ea85 ^
c6f9c3889 ^










4320b158d ^
c6f9c3889 ^
57eb763c6 ^
c6f9c3889 ^
34a53e804 ^

57609902c ^
c6f9c3889 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167