From 333525360b22f3d3ea31db46a4d2f1b4edbfebdb Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 26 Aug 2019 11:55:26 -0700 Subject: 5592 - switch register names to lowercase --- html/apps/subx-common.subx.html | 2016 +++++++++++++++++++-------------------- 1 file changed, 1008 insertions(+), 1008 deletions(-) (limited to 'html/apps/subx-common.subx.html') diff --git a/html/apps/subx-common.subx.html b/html/apps/subx-common.subx.html index fb34fb72..d752f2dd 100644 --- a/html/apps/subx-common.subx.html +++ b/html/apps/subx-common.subx.html @@ -91,84 +91,84 @@ if ('onhashchange' in window) { 28 # return empty string on reaching end of file 29 next-word: # line : (address stream byte), out : (address slice) 30 # . prolog - 31 55/push-EBP - 32 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 31 55/push-ebp + 32 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 33 # . save registers - 34 50/push-EAX - 35 51/push-ECX - 36 56/push-ESI - 37 57/push-EDI - 38 # ESI = line - 39 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI - 40 # EDI = out - 41 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI + 34 50/push-eax + 35 51/push-ecx + 36 56/push-esi + 37 57/push-edi + 38 # esi = line + 39 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi + 40 # edi = out + 41 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi 42 # skip-chars-matching(line, ' ') 43 # . . push args 44 68/push 0x20/imm32/space - 45 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) + 45 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 46 # . . call 47 e8/call skip-chars-matching/disp32 48 # . . discard args - 49 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 49 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 50 $next-word:check0: 51 # if (line->read >= line->write) clear out and return - 52 # . EAX = line->read - 53 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 . # copy *(ESI+4) to EAX - 54 # . if (EAX < line->write) goto next check - 55 3b/compare 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . . # compare EAX with *ESI + 52 # . eax = line->read + 53 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 0/r32/eax 4/disp8 . # copy *(esi+4) to eax + 54 # . if (eax < line->write) goto next check + 55 3b/compare 0/mod/indirect 6/rm32/esi . . . 0/r32/eax . . # compare eax with *esi 56 7c/jump-if-lesser $next-word:check-for-comment/disp8 57 # . return out = {0, 0} - 58 c7 0/subop/copy 0/mod/direct 7/rm32/EDI . . . . . 0/imm32 # copy to *EDI - 59 c7 0/subop/copy 1/mod/*+disp8 7/rm32/EDI . . . . 4/disp8 0/imm32 # copy to *(EDI+4) + 58 c7 0/subop/copy 0/mod/direct 7/rm32/edi . . . . . 0/imm32 # copy to *edi + 59 c7 0/subop/copy 1/mod/*+disp8 7/rm32/edi . . . . 4/disp8 0/imm32 # copy to *(edi+4) 60 eb/jump $next-word:end/disp8 61 $next-word:check-for-comment: 62 # out->start = &line->data[line->read] - 63 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 4/disp8 . # copy *(ESI+4) to ECX - 64 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/EAX 0xc/disp8 . # copy ESI+ECX+12 to EAX - 65 89/copy 0/mod/indirect 7/rm32/EDI . . . 0/r32/EAX . . # copy EAX to *EDI + 63 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 1/r32/ecx 4/disp8 . # copy *(esi+4) to ecx + 64 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 1/index/ecx . 0/r32/eax 0xc/disp8 . # copy esi+ecx+12 to eax + 65 89/copy 0/mod/indirect 7/rm32/edi . . . 0/r32/eax . . # copy eax to *edi 66 # if (line->data[line->read] == '#') out->end = &line->data[line->write]), skip rest of stream and return - 67 # . EAX = line->data[line->read] - 68 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX - 69 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/AL 0xc/disp8 . # copy byte at *(ESI+ECX+12) to AL + 67 # . eax = line->data[line->read] + 68 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax + 69 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/esi 1/index/ecx . 0/r32/AL 0xc/disp8 . # copy byte at *(esi+ecx+12) to AL 70 # . compare - 71 3d/compare-EAX-and 0x23/imm32/pound + 71 3d/compare-eax-and 0x23/imm32/pound 72 75/jump-if-not-equal $next-word:regular-word/disp8 73 $next-word:comment: 74 # . out->end = &line->data[line->write] - 75 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . . # copy *ESI to EAX - 76 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 0/r32/EAX 0xc/disp8 . # copy ESI+EAX+12 to EAX - 77 89/copy 1/mod/*+disp8 7/rm32/EDI . . . 0/r32/EAX 4/disp8 . # copy EAX to *(EDI+4) + 75 8b/copy 0/mod/indirect 6/rm32/esi . . . 0/r32/eax . . # copy *esi to eax + 76 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy esi+eax+12 to eax + 77 89/copy 1/mod/*+disp8 7/rm32/edi . . . 0/r32/eax 4/disp8 . # copy eax to *(edi+4) 78 # . line->read = line->write - 79 89/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 . # copy EAX to *(ESI+4) + 79 89/copy 1/mod/*+disp8 6/rm32/esi . . . 0/r32/eax 4/disp8 . # copy eax to *(esi+4) 80 # . return 81 eb/jump $next-word:end/disp8 82 $next-word:regular-word: 83 # otherwise skip-chars-not-matching-whitespace(line) # including trailing newline 84 # . . push args - 85 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) + 85 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 86 # . . call 87 e8/call skip-chars-not-matching-whitespace/disp32 88 # . . discard args - 89 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 89 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 90 # out->end = &line->data[line->read] - 91 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 4/disp8 . # copy *(ESI+4) to ECX - 92 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 1/index/ECX . 0/r32/EAX 0xc/disp8 . # copy ESI+ECX+12 to EAX - 93 89/copy 1/mod/*+disp8 7/rm32/EDI . . . 0/r32/EAX 4/disp8 . # copy EAX to *(EDI+4) + 91 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 1/r32/ecx 4/disp8 . # copy *(esi+4) to ecx + 92 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 1/index/ecx . 0/r32/eax 0xc/disp8 . # copy esi+ecx+12 to eax + 93 89/copy 1/mod/*+disp8 7/rm32/edi . . . 0/r32/eax 4/disp8 . # copy eax to *(edi+4) 94 $next-word:end: 95 # . restore registers - 96 5f/pop-to-EDI - 97 5e/pop-to-ESI - 98 59/pop-to-ECX - 99 58/pop-to-EAX + 96 5f/pop-to-edi + 97 5e/pop-to-esi + 98 59/pop-to-ecx + 99 58/pop-to-eax 100 # . epilog - 101 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 102 5d/pop-to-EBP + 101 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 102 5d/pop-to-ebp 103 c3/return 104 105 test-next-word: 106 # . prolog - 107 55/push-EBP - 108 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 107 55/push-ebp + 108 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 109 # setup 110 # . clear-stream(_test-stream) 111 # . . push args @@ -176,11 +176,11 @@ if ('onhashchange' in window) { 113 # . . call 114 e8/call clear-stream/disp32 115 # . . discard args - 116 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 117 # var slice/ECX = {0, 0} + 116 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + 117 # var slice/ecx = {0, 0} 118 68/push 0/imm32/end 119 68/push 0/imm32/start - 120 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX + 120 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 121 # write(_test-stream, " ab") 122 # . . push args 123 68/push " ab"/imm32 @@ -188,50 +188,50 @@ if ('onhashchange' in window) { 125 # . . call 126 e8/call write/disp32 127 # . . discard args - 128 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 128 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 129 # next-word(_test-stream, slice) 130 # . . push args - 131 51/push-ECX + 131 51/push-ecx 132 68/push _test-stream/imm32 133 # . . call 134 e8/call next-word/disp32 135 # . . discard args - 136 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 136 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 137 # check-ints-equal(slice->start - _test-stream->data, 2, msg) 138 # . check-ints-equal(slice->start - _test-stream, 14, msg) 139 # . . push args 140 68/push "F - test-next-word: start"/imm32 141 68/push 0xe/imm32 142 # . . push slice->start - _test-stream - 143 8b/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # copy *ECX to EAX - 144 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32 # subtract from EAX - 145 50/push-EAX + 143 8b/copy 0/mod/indirect 1/rm32/ecx . . . 0/r32/eax . . # copy *ecx to eax + 144 81 5/subop/subtract 3/mod/direct 0/rm32/eax . . . . . _test-stream/imm32 # subtract from eax + 145 50/push-eax 146 # . . call 147 e8/call check-ints-equal/disp32 148 # . . discard args - 149 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 149 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 150 # check-ints-equal(slice->end - _test-stream->data, 4, msg) 151 # . check-ints-equal(slice->end - _test-stream, 16, msg) 152 # . . push args 153 68/push "F - test-next-word: end"/imm32 154 68/push 0x10/imm32 155 # . . push slice->end - _test-stream - 156 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 . # copy *(ECX+4) to EAX - 157 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32 # subtract from EAX - 158 50/push-EAX + 156 8b/copy 1/mod/*+disp8 1/rm32/ecx . . . 0/r32/eax 4/disp8 . # copy *(ecx+4) to eax + 157 81 5/subop/subtract 3/mod/direct 0/rm32/eax . . . . . _test-stream/imm32 # subtract from eax + 158 50/push-eax 159 # . . call 160 e8/call check-ints-equal/disp32 161 # . . discard args - 162 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 162 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 163 # . epilog - 164 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 165 5d/pop-to-EBP + 164 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 165 5d/pop-to-ebp 166 c3/return 167 168 test-next-word-returns-whole-comment: 169 # . prolog - 170 55/push-EBP - 171 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 170 55/push-ebp + 171 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 172 # setup 173 # . clear-stream(_test-stream) 174 # . . push args @@ -239,11 +239,11 @@ if ('onhashchange' in window) { 176 # . . call 177 e8/call clear-stream/disp32 178 # . . discard args - 179 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 180 # var slice/ECX = {0, 0} + 179 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + 180 # var slice/ecx = {0, 0} 181 68/push 0/imm32/end 182 68/push 0/imm32/start - 183 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX + 183 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 184 # write(_test-stream, " # a") 185 # . . push args 186 68/push " # a"/imm32 @@ -251,50 +251,50 @@ if ('onhashchange' in window) { 188 # . . call 189 e8/call write/disp32 190 # . . discard args - 191 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 191 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 192 # next-word(_test-stream, slice) 193 # . . push args - 194 51/push-ECX + 194 51/push-ecx 195 68/push _test-stream/imm32 196 # . . call 197 e8/call next-word/disp32 198 # . . discard args - 199 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 199 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 200 # check-ints-equal(slice->start - _test-stream->data, 2, msg) 201 # . check-ints-equal(slice->start - _test-stream, 14, msg) 202 # . . push args 203 68/push "F - test-next-word-returns-whole-comment: start"/imm32 204 68/push 0xe/imm32 205 # . . push slice->start - _test-stream - 206 8b/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # copy *ECX to EAX - 207 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32 # subtract from EAX - 208 50/push-EAX + 206 8b/copy 0/mod/indirect 1/rm32/ecx . . . 0/r32/eax . . # copy *ecx to eax + 207 81 5/subop/subtract 3/mod/direct 0/rm32/eax . . . . . _test-stream/imm32 # subtract from eax + 208 50/push-eax 209 # . . call 210 e8/call check-ints-equal/disp32 211 # . . discard args - 212 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 212 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 213 # check-ints-equal(slice->end - _test-stream->data, 5, msg) 214 # . check-ints-equal(slice->end - _test-stream, 17, msg) 215 # . . push args 216 68/push "F - test-next-word-returns-whole-comment: end"/imm32 217 68/push 0x11/imm32 218 # . . push slice->end - _test-stream - 219 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 . # copy *(ECX+4) to EAX - 220 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . _test-stream/imm32 # subtract from EAX - 221 50/push-EAX + 219 8b/copy 1/mod/*+disp8 1/rm32/ecx . . . 0/r32/eax 4/disp8 . # copy *(ecx+4) to eax + 220 81 5/subop/subtract 3/mod/direct 0/rm32/eax . . . . . _test-stream/imm32 # subtract from eax + 221 50/push-eax 222 # . . call 223 e8/call check-ints-equal/disp32 224 # . . discard args - 225 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 225 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 226 # . epilog - 227 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 228 5d/pop-to-EBP + 227 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 228 5d/pop-to-ebp 229 c3/return 230 231 test-next-word-returns-empty-string-on-eof: 232 # . prolog - 233 55/push-EBP - 234 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 233 55/push-ebp + 234 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 235 # setup 236 # . clear-stream(_test-stream) 237 # . . push args @@ -302,80 +302,80 @@ if ('onhashchange' in window) { 239 # . . call 240 e8/call clear-stream/disp32 241 # . . discard args - 242 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 243 # var slice/ECX = {0, 0} + 242 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + 243 # var slice/ecx = {0, 0} 244 68/push 0/imm32/end 245 68/push 0/imm32/start - 246 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX + 246 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 247 # write nothing to _test-stream 248 # next-word(_test-stream, slice) 249 # . . push args - 250 51/push-ECX + 250 51/push-ecx 251 68/push _test-stream/imm32 252 # . . call 253 e8/call next-word/disp32 254 # . . discard args - 255 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 255 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 256 # check-ints-equal(slice->end - slice->start, 0, msg) 257 # . . push args 258 68/push "F - test-next-word-returns-empty-string-on-eof"/imm32 259 68/push 0/imm32 260 # . . push slice->end - slice->start - 261 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 . # copy *(ECX+4) to EAX - 262 2b/subtract 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # subtract *ECX from EAX - 263 50/push-EAX + 261 8b/copy 1/mod/*+disp8 1/rm32/ecx . . . 0/r32/eax 4/disp8 . # copy *(ecx+4) to eax + 262 2b/subtract 0/mod/indirect 1/rm32/ecx . . . 0/r32/eax . . # subtract *ecx from eax + 263 50/push-eax 264 # . . call 265 e8/call check-ints-equal/disp32 266 # . . discard args - 267 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 267 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 268 # . epilog - 269 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 270 5d/pop-to-EBP + 269 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 270 5d/pop-to-ebp 271 c3/return 272 273 # update line->read to end of string literal surrounded by double quotes 274 # line->read must start out at a double-quote 275 skip-string: # line : (address stream) 276 # . prolog - 277 55/push-EBP - 278 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 277 55/push-ebp + 278 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 279 # . save registers - 280 50/push-EAX - 281 51/push-ECX - 282 52/push-EDX - 283 # ECX = line - 284 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX - 285 # EAX = skip-string-in-slice(&line->data[line->read], &line->data[line->write]) + 280 50/push-eax + 281 51/push-ecx + 282 52/push-edx + 283 # ecx = line + 284 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 1/r32/ecx 8/disp8 . # copy *(ebp+8) to ecx + 285 # eax = skip-string-in-slice(&line->data[line->read], &line->data[line->write]) 286 # . . push &line->data[line->write] - 287 8b/copy 1/mod/*+disp8 1/rm32/ECX . . 2/r32/EDX 8/disp8 . # copy *(ECX+8) to EDX - 288 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX . 2/r32/EDX 0xc/disp8 . # copy ECX+EDX+12 to EDX - 289 52/push-EDX + 287 8b/copy 1/mod/*+disp8 1/rm32/ecx . . 2/r32/edx 8/disp8 . # copy *(ecx+8) to edx + 288 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ecx 2/index/edx . 2/r32/edx 0xc/disp8 . # copy ecx+edx+12 to edx + 289 52/push-edx 290 # . . push &line->data[line->read] - 291 8b/copy 1/mod/*+disp8 1/rm32/ECX . . 2/r32/EDX 4/disp8 . # copy *(ECX+4) to EDX - 292 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX . 2/r32/EDX 0xc/disp8 . # copy ECX+EDX+12 to EDX - 293 52/push-EDX + 291 8b/copy 1/mod/*+disp8 1/rm32/ecx . . 2/r32/edx 4/disp8 . # copy *(ecx+4) to edx + 292 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ecx 2/index/edx . 2/r32/edx 0xc/disp8 . # copy ecx+edx+12 to edx + 293 52/push-edx 294 # . . call 295 e8/call skip-string-in-slice/disp32 296 # . . discard args - 297 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 298 # line->read = EAX - line->data - 299 29/subtract 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # subtract ECX from EAX - 300 2d/subtract-from-EAX 0xc/imm32 - 301 89/copy 1/mod/*+disp8 1/rm32/ECX . . 0/r32/EAX 4/disp8 . # copy EAX to *(ECX+4) + 297 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 298 # line->read = eax - line->data + 299 29/subtract 3/mod/direct 0/rm32/eax . . . 1/r32/ecx . . # subtract ecx from eax + 300 2d/subtract-from-eax 0xc/imm32 + 301 89/copy 1/mod/*+disp8 1/rm32/ecx . . 0/r32/eax 4/disp8 . # copy eax to *(ecx+4) 302 $skip-string:end: 303 # . restore registers - 304 5a/pop-to-EDX - 305 59/pop-to-ECX - 306 58/pop-to-EAX + 304 5a/pop-to-edx + 305 59/pop-to-ecx + 306 58/pop-to-eax 307 # . epilog - 308 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 309 5d/pop-to-EBP + 308 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 309 5d/pop-to-ebp 310 c3/return 311 312 test-skip-string: 313 # . prolog - 314 55/push-EBP - 315 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 314 55/push-ebp + 315 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 316 # setup 317 # . clear-stream(_test-input-stream) 318 # . . push args @@ -383,7 +383,7 @@ if ('onhashchange' in window) { 320 # . . call 321 e8/call clear-stream/disp32 322 # . . discard args - 323 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 323 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 324 # . write(_test-input-stream, "\"abc\" def") 325 # . indices: 0123 45 326 # . . push args @@ -392,43 +392,43 @@ if ('onhashchange' in window) { 329 # . . call 330 e8/call write/disp32 331 # . . discard args - 332 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 332 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 333 # precondition: line->read == 0 334 # . . push args 335 68/push "F - test-skip-string/precondition"/imm32 336 68/push 0/imm32 - 337 b8/copy-to-EAX _test-input-stream/imm32 - 338 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 337 b8/copy-to-eax _test-input-stream/imm32 + 338 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 339 # . . call 340 e8/call check-ints-equal/disp32 341 # . . discard args - 342 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 342 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 343 # skip-string(_test-input-stream) 344 # . . push args 345 68/push _test-input-stream/imm32 346 # . . call 347 e8/call skip-string/disp32 348 # . . discard args - 349 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 349 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 350 # check-ints-equal(line->read, 5, msg) 351 # . . push args 352 68/push "F - test-skip-string"/imm32 353 68/push 5/imm32 - 354 b8/copy-to-EAX _test-input-stream/imm32 - 355 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 354 b8/copy-to-eax _test-input-stream/imm32 + 355 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 356 # . . call 357 e8/call check-ints-equal/disp32 358 # . . discard args - 359 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 359 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 360 # . epilog - 361 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 362 5d/pop-to-EBP + 361 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 362 5d/pop-to-ebp 363 c3/return 364 365 test-skip-string-ignores-spaces: 366 # . prolog - 367 55/push-EBP - 368 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 367 55/push-ebp + 368 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 369 # setup 370 # . clear-stream(_test-input-stream) 371 # . . push args @@ -436,7 +436,7 @@ if ('onhashchange' in window) { 373 # . . call 374 e8/call clear-stream/disp32 375 # . . discard args - 376 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 376 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 377 # . write(_test-input-stream, "\"a b\"/yz") 378 # . indices: 0123 45 379 # . . push args @@ -445,43 +445,43 @@ if ('onhashchange' in window) { 382 # . . call 383 e8/call write/disp32 384 # . . discard args - 385 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 385 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 386 # precondition: line->read == 0 387 # . . push args 388 68/push "F - test-skip-string-ignores-spaces/precondition"/imm32 389 68/push 0/imm32 - 390 b8/copy-to-EAX _test-input-stream/imm32 - 391 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 390 b8/copy-to-eax _test-input-stream/imm32 + 391 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 392 # . . call 393 e8/call check-ints-equal/disp32 394 # . . discard args - 395 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 395 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 396 # skip-string(_test-input-stream) 397 # . . push args 398 68/push _test-input-stream/imm32 399 # . . call 400 e8/call skip-string/disp32 401 # . . discard args - 402 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 402 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 403 # check-ints-equal(line->read, 5, msg) 404 # . . push args 405 68/push "F - test-skip-string-ignores-spaces"/imm32 406 68/push 5/imm32 - 407 b8/copy-to-EAX _test-input-stream/imm32 - 408 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 407 b8/copy-to-eax _test-input-stream/imm32 + 408 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 409 # . . call 410 e8/call check-ints-equal/disp32 411 # . . discard args - 412 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 412 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 413 # . epilog - 414 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 415 5d/pop-to-EBP + 414 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 415 5d/pop-to-ebp 416 c3/return 417 418 test-skip-string-ignores-escapes: 419 # . prolog - 420 55/push-EBP - 421 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 420 55/push-ebp + 421 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 422 # setup 423 # . clear-stream(_test-input-stream) 424 # . . push args @@ -489,7 +489,7 @@ if ('onhashchange' in window) { 426 # . . call 427 e8/call clear-stream/disp32 428 # . . discard args - 429 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 429 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 430 # . write(_test-input-stream, "\"a\\\"b\"/yz") 431 # . indices: 01 2 34 56 432 # . . push args @@ -498,43 +498,43 @@ if ('onhashchange' in window) { 435 # . . call 436 e8/call write/disp32 437 # . . discard args - 438 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 438 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 439 # precondition: line->read == 0 440 # . . push args 441 68/push "F - test-skip-string-ignores-escapes/precondition"/imm32 442 68/push 0/imm32 - 443 b8/copy-to-EAX _test-input-stream/imm32 - 444 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 443 b8/copy-to-eax _test-input-stream/imm32 + 444 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 445 # . . call 446 e8/call check-ints-equal/disp32 447 # . . discard args - 448 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 448 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 449 # skip-string(_test-input-stream) 450 # . . push args 451 68/push _test-input-stream/imm32 452 # . . call 453 e8/call skip-string/disp32 454 # . . discard args - 455 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 455 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 456 # check-ints-equal(line->read, 6, msg) 457 # . . push args 458 68/push "F - test-skip-string-ignores-escapes"/imm32 459 68/push 6/imm32 - 460 b8/copy-to-EAX _test-input-stream/imm32 - 461 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 460 b8/copy-to-eax _test-input-stream/imm32 + 461 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 462 # . . call 463 e8/call check-ints-equal/disp32 464 # . . discard args - 465 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 465 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 466 # . epilog - 467 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 468 5d/pop-to-EBP + 467 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 468 5d/pop-to-ebp 469 c3/return 470 471 test-skip-string-works-from-mid-stream: 472 # . prolog - 473 55/push-EBP - 474 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 473 55/push-ebp + 474 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 475 # setup 476 # . clear-stream(_test-input-stream) 477 # . . push args @@ -542,7 +542,7 @@ if ('onhashchange' in window) { 479 # . . call 480 e8/call clear-stream/disp32 481 # . . discard args - 482 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 482 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 483 # . write(_test-input-stream, "0 \"a\\\"b\"/yz") 484 # . indices: 01 2 34 56 485 # . . push args @@ -551,213 +551,213 @@ if ('onhashchange' in window) { 488 # . . call 489 e8/call write/disp32 490 # . . discard args - 491 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 491 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 492 # precondition: line->read == 2 - 493 c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 2/imm32 # copy to *(EAX+4) + 493 c7 0/subop/copy 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 2/imm32 # copy to *(eax+4) 494 # skip-string(_test-input-stream) 495 # . . push args 496 68/push _test-input-stream/imm32 497 # . . call 498 e8/call skip-string/disp32 499 # . . discard args - 500 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 500 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 501 # check-ints-equal(line->read, 8, msg) 502 # . . push args 503 68/push "F - test-skip-string-works-from-mid-stream"/imm32 504 68/push 8/imm32 - 505 b8/copy-to-EAX _test-input-stream/imm32 - 506 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 . # push *(EAX+4) + 505 b8/copy-to-eax _test-input-stream/imm32 + 506 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) 507 # . . call 508 e8/call check-ints-equal/disp32 509 # . . discard args - 510 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 510 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 511 # . epilog - 512 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 513 5d/pop-to-EBP + 512 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 513 5d/pop-to-ebp 514 c3/return 515 - 516 skip-string-in-slice: # curr : (address byte), end : (address byte) -> new_curr/EAX + 516 skip-string-in-slice: # curr : (address byte), end : (address byte) -> new_curr/eax 517 # . prolog - 518 55/push-EBP - 519 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 518 55/push-ebp + 519 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 520 # . save registers - 521 51/push-ECX - 522 52/push-EDX - 523 53/push-EBX - 524 # ECX = curr - 525 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX - 526 # EDX = end - 527 8b/copy 1/mod/*+disp8 5/rm32/EBP . . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX - 528 # EAX = 0 - 529 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX + 521 51/push-ecx + 522 52/push-edx + 523 53/push-ebx + 524 # ecx = curr + 525 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 1/r32/ecx 8/disp8 . # copy *(ebp+8) to ecx + 526 # edx = end + 527 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx + 528 # eax = 0 + 529 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax 530 # skip initial dquote - 531 41/increment-ECX + 531 41/increment-ecx 532 $skip-string-in-slice:loop: 533 # if (curr >= end) return curr - 534 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX + 534 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . . # compare ecx with edx 535 73/jump-if-greater-unsigned-or-equal $skip-string-in-slice:return-curr/disp8 536 # AL = *curr - 537 8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy byte at *ECX to AL + 537 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . . # copy byte at *ecx to AL 538 $skip-string-in-slice:dquote: - 539 # if (EAX == '"') break - 540 3d/compare-EAX-and 0x22/imm32/double-quote + 539 # if (eax == '"') break + 540 3d/compare-eax-and 0x22/imm32/double-quote 541 74/jump-if-equal $skip-string-in-slice:break/disp8 542 $skip-string-in-slice:check-for-escape: - 543 # if (EAX == '\') escape next char - 544 3d/compare-EAX-and 0x5c/imm32/backslash + 543 # if (eax == '\') escape next char + 544 3d/compare-eax-and 0x5c/imm32/backslash 545 75/jump-if-not-equal $skip-string-in-slice:continue/disp8 546 $skip-string-in-slice:escape: - 547 41/increment-ECX + 547 41/increment-ecx 548 $skip-string-in-slice:continue: 549 # ++curr - 550 41/increment-ECX + 550 41/increment-ecx 551 eb/jump $skip-string-in-slice:loop/disp8 552 $skip-string-in-slice:break: 553 # skip final dquote - 554 41/increment-ECX + 554 41/increment-ecx 555 $skip-string-in-slice:return-curr: 556 # return curr - 557 89/copy 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # copy ECX to EAX + 557 89/copy 3/mod/direct 0/rm32/eax . . . 1/r32/ecx . . # copy ecx to eax 558 $skip-string-in-slice:end: 559 # . restore registers - 560 5b/pop-to-EBX - 561 5a/pop-to-EDX - 562 59/pop-to-ECX + 560 5b/pop-to-ebx + 561 5a/pop-to-edx + 562 59/pop-to-ecx 563 # . epilog - 564 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 565 5d/pop-to-EBP + 564 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 565 5d/pop-to-ebp 566 c3/return 567 568 test-skip-string-in-slice: 569 # . prolog - 570 55/push-EBP - 571 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 572 # setup: (EAX..ECX) = "\"abc\" def" - 573 b8/copy-to-EAX "\"abc\" def"/imm32 - 574 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 575 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 576 05/add-to-EAX 4/imm32 - 577 # EAX = skip-string-in-slice(EAX, ECX) + 570 55/push-ebp + 571 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 572 # setup: (eax..ecx) = "\"abc\" def" + 573 b8/copy-to-eax "\"abc\" def"/imm32 + 574 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 575 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 576 05/add-to-eax 4/imm32 + 577 # eax = skip-string-in-slice(eax, ecx) 578 # . . push args - 579 51/push-ECX - 580 50/push-EAX + 579 51/push-ecx + 580 50/push-eax 581 # . . call 582 e8/call skip-string-in-slice/disp32 583 # . . discard args - 584 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 585 # check-ints-equal(ECX-EAX, 4, msg) # number of chars remaining after the string literal + 584 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 585 # check-ints-equal(ecx-eax, 4, msg) # number of chars remaining after the string literal 586 # . . push args 587 68/push "F - test-skip-string-in-slice"/imm32 588 68/push 4/imm32 - 589 # . . push ECX-EAX - 590 29/subtract 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # subtract EAX from ECX - 591 51/push-ECX + 589 # . . push ecx-eax + 590 29/subtract 3/mod/direct 1/rm32/ecx . . . 0/r32/eax . . # subtract eax from ecx + 591 51/push-ecx 592 # . . call 593 e8/call check-ints-equal/disp32 594 # . . discard args - 595 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 595 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 596 # . epilog - 597 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 598 5d/pop-to-EBP + 597 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 598 5d/pop-to-ebp 599 c3/return 600 601 test-skip-string-in-slice-ignores-spaces: 602 # . prolog - 603 55/push-EBP - 604 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 605 # setup: (EAX..ECX) = "\"a b\"/yz" - 606 b8/copy-to-EAX "\"a b\"/yz"/imm32 - 607 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 608 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 609 05/add-to-EAX 4/imm32 - 610 # EAX = skip-string-in-slice(EAX, ECX) + 603 55/push-ebp + 604 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 605 # setup: (eax..ecx) = "\"a b\"/yz" + 606 b8/copy-to-eax "\"a b\"/yz"/imm32 + 607 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 608 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 609 05/add-to-eax 4/imm32 + 610 # eax = skip-string-in-slice(eax, ecx) 611 # . . push args - 612 51/push-ECX - 613 50/push-EAX + 612 51/push-ecx + 613 50/push-eax 614 # . . call 615 e8/call skip-string-in-slice/disp32 616 # . . discard args - 617 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 618 # check-ints-equal(ECX-EAX, 3, msg) # number of chars remaining after the string literal + 617 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 618 # check-ints-equal(ecx-eax, 3, msg) # number of chars remaining after the string literal 619 # . . push args 620 68/push "F - test-skip-string-in-slice-ignores-spaces"/imm32 621 68/push 3/imm32 - 622 # . . push ECX-EAX - 623 29/subtract 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # subtract EAX from ECX - 624 51/push-ECX + 622 # . . push ecx-eax + 623 29/subtract 3/mod/direct 1/rm32/ecx . . . 0/r32/eax . . # subtract eax from ecx + 624 51/push-ecx 625 # . . call 626 e8/call check-ints-equal/disp32 627 # . . discard args - 628 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 628 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 629 # . epilog - 630 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 631 5d/pop-to-EBP + 630 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 631 5d/pop-to-ebp 632 c3/return 633 634 test-skip-string-in-slice-ignores-escapes: 635 # . prolog - 636 55/push-EBP - 637 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 638 # setup: (EAX..ECX) = "\"a\\\"b\"/yz" - 639 b8/copy-to-EAX "\"a\\\"b\"/yz"/imm32 - 640 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 641 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 642 05/add-to-EAX 4/imm32 - 643 # EAX = skip-string-in-slice(EAX, ECX) + 636 55/push-ebp + 637 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 638 # setup: (eax..ecx) = "\"a\\\"b\"/yz" + 639 b8/copy-to-eax "\"a\\\"b\"/yz"/imm32 + 640 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 641 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 642 05/add-to-eax 4/imm32 + 643 # eax = skip-string-in-slice(eax, ecx) 644 # . . push args - 645 51/push-ECX - 646 50/push-EAX + 645 51/push-ecx + 646 50/push-eax 647 # . . call 648 e8/call skip-string-in-slice/disp32 649 # . . discard args - 650 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 651 # check-ints-equal(ECX-EAX, 3, msg) # number of chars remaining after the string literal + 650 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 651 # check-ints-equal(ecx-eax, 3, msg) # number of chars remaining after the string literal 652 # . . push args 653 68/push "F - test-skip-string-in-slice-ignores-escapes"/imm32 654 68/push 3/imm32 - 655 # . . push ECX-EAX - 656 29/subtract 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # subtract EAX from ECX - 657 51/push-ECX + 655 # . . push ecx-eax + 656 29/subtract 3/mod/direct 1/rm32/ecx . . . 0/r32/eax . . # subtract eax from ecx + 657 51/push-ecx 658 # . . call 659 e8/call check-ints-equal/disp32 660 # . . discard args - 661 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 661 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 662 # . epilog - 663 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 664 5d/pop-to-EBP + 663 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 664 5d/pop-to-ebp 665 c3/return 666 667 test-skip-string-in-slice-stops-at-end: 668 # . prolog - 669 55/push-EBP - 670 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 671 # setup: (EAX..ECX) = "\"abc" # unbalanced dquote - 672 b8/copy-to-EAX "\"abc"/imm32 - 673 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 674 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 675 05/add-to-EAX 4/imm32 - 676 # EAX = skip-string-in-slice(EAX, ECX) + 669 55/push-ebp + 670 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 671 # setup: (eax..ecx) = "\"abc" # unbalanced dquote + 672 b8/copy-to-eax "\"abc"/imm32 + 673 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 674 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 675 05/add-to-eax 4/imm32 + 676 # eax = skip-string-in-slice(eax, ecx) 677 # . . push args - 678 51/push-ECX - 679 50/push-EAX + 678 51/push-ecx + 679 50/push-eax 680 # . . call 681 e8/call skip-string-in-slice/disp32 682 # . . discard args - 683 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 684 # check-ints-equal(ECX-EAX, 0, msg) # skipped to end of slice + 683 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 684 # check-ints-equal(ecx-eax, 0, msg) # skipped to end of slice 685 # . . push args 686 68/push "F - test-skip-string-in-slice-stops-at-end"/imm32 687 68/push 0/imm32 - 688 # . . push ECX-EAX - 689 29/subtract 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # subtract EAX from ECX - 690 51/push-ECX + 688 # . . push ecx-eax + 689 29/subtract 3/mod/direct 1/rm32/ecx . . . 0/r32/eax . . # subtract eax from ecx + 690 51/push-ecx 691 # . . call 692 e8/call check-ints-equal/disp32 693 # . . discard args - 694 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 694 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 695 # . epilog - 696 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 697 5d/pop-to-EBP + 696 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 697 5d/pop-to-ebp 698 c3/return 699 700 # write an entire stream's contents to a buffered-file @@ -767,48 +767,48 @@ if ('onhashchange' in window) { 704 # we'll go with the first way for now 705 write-stream-data: # f : (address buffered-file), s : (address stream) -> <void> 706 # . prolog - 707 55/push-EBP - 708 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 707 55/push-ebp + 708 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 709 # . save registers - 710 50/push-EAX - 711 51/push-ECX - 712 56/push-ESI - 713 # ESI = s - 714 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI - 715 # var slice/ECX = {s->data, s->data + s->write} + 710 50/push-eax + 711 51/push-ecx + 712 56/push-esi + 713 # esi = s + 714 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 0xc/disp8 . # copy *(ebp+12) to esi + 715 # var slice/ecx = {s->data, s->data + s->write} 716 # . push s->data + s->write - 717 8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . . # copy *ESI to EAX - 718 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 0/r32/EAX 0xc/disp8 . # copy ESI+EAX+12 to EAX - 719 50/push-EAX + 717 8b/copy 0/mod/indirect 6/rm32/esi . . . 0/r32/eax . . # copy *esi to eax + 718 8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/esi 0/index/eax . 0/r32/eax 0xc/disp8 . # copy esi+eax+12 to eax + 719 50/push-eax 720 # . push s->data - 721 8d/copy-address 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 0xc/disp8 . # copy ESI+12 to EAX - 722 50/push-EAX - 723 # . ECX = ESP - 724 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX + 721 8d/copy-address 1/mod/*+disp8 6/rm32/esi . . . 0/r32/eax 0xc/disp8 . # copy esi+12 to eax + 722 50/push-eax + 723 # . ecx = esp + 724 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 725 # write-slice-buffered(f, slice) 726 # . . push args - 727 51/push-ECX - 728 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) + 727 51/push-ecx + 728 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 729 # . . call 730 e8/call write-slice-buffered/disp32 731 # . . discard args - 732 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 732 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 733 $write-stream-data:end: 734 # . restore locals - 735 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 735 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 736 # . restore registers - 737 5e/pop-to-ESI - 738 59/pop-to-ECX - 739 58/pop-to-EAX + 737 5e/pop-to-esi + 738 59/pop-to-ecx + 739 58/pop-to-eax 740 # . epilog - 741 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 742 5d/pop-to-EBP + 741 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 742 5d/pop-to-ebp 743 c3/return 744 745 test-write-stream-data: 746 # . prolog - 747 55/push-EBP - 748 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 747 55/push-ebp + 748 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 749 # setup 750 # . clear-stream(_test-output-stream) 751 # . . push args @@ -816,23 +816,23 @@ if ('onhashchange' in window) { 753 # . . call 754 e8/call clear-stream/disp32 755 # . . discard args - 756 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 756 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 757 # . clear-stream(_test-output-buffered-file+4) 758 # . . push args - 759 b8/copy-to-EAX _test-output-buffered-file/imm32 - 760 05/add-to-EAX 4/imm32 - 761 50/push-EAX + 759 b8/copy-to-eax _test-output-buffered-file/imm32 + 760 05/add-to-eax 4/imm32 + 761 50/push-eax 762 # . . call 763 e8/call clear-stream/disp32 764 # . . discard args - 765 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 765 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 766 # . clear-stream(_test-input-stream) 767 # . . push args 768 68/push _test-input-stream/imm32 769 # . . call 770 e8/call clear-stream/disp32 771 # . . discard args - 772 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 772 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 773 # initialize input 774 # . write(_test-input-stream, "abcd") 775 # . . push args @@ -841,7 +841,7 @@ if ('onhashchange' in window) { 778 # . . call 779 e8/call write/disp32 780 # . . discard args - 781 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 781 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 782 # write-stream-data(_test-output-buffered-file, _test-input-stream) 783 # . . push args 784 68/push _test-input-stream/imm32 @@ -849,7 +849,7 @@ if ('onhashchange' in window) { 786 # . . call 787 e8/call write-stream-data/disp32 788 # . . discard args - 789 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 789 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 790 # check that the write happened as expected 791 # . flush(_test-output-buffered-file) 792 # . . push args @@ -857,7 +857,7 @@ if ('onhashchange' in window) { 794 # . . call 795 e8/call flush/disp32 796 # . . discard args - 797 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + 797 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 798 # . check-stream-equal(_test-output-stream, "abcd", msg) 799 # . . push args 800 68/push "F - test-write-stream-data"/imm32 @@ -866,13 +866,13 @@ if ('onhashchange' in window) { 803 # . . call 804 e8/call check-stream-equal/disp32 805 # . . discard args - 806 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 806 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 807 # . epilog - 808 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 809 5d/pop-to-EBP + 808 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 809 5d/pop-to-ebp 810 c3/return 811 - 812 has-metadata?: # word : (address slice), s : (address string) -> EAX : boolean + 812 has-metadata?: # word : (address slice), s : (address string) -> eax : boolean 813 # pseudocode: 814 # var twig : &slice = next-token-from-slice(word->start, word->end, '/') # skip name 815 # curr = twig->end @@ -883,261 +883,261 @@ if ('onhashchange' in window) { 820 # curr = twig->end 821 # return false 822 # . prolog - 823 55/push-EBP - 824 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + 823 55/push-ebp + 824 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 825 # . save registers - 826 51/push-ECX - 827 52/push-EDX - 828 56/push-ESI - 829 57/push-EDI - 830 # ESI = word - 831 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI - 832 # EDX = word->end - 833 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 2/r32/EDX 4/disp8 . # copy *(ESI+4) to EDX - 834 # var twig/EDI : (address slice) = {0, 0} + 826 51/push-ecx + 827 52/push-edx + 828 56/push-esi + 829 57/push-edi + 830 # esi = word + 831 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi + 832 # edx = word->end + 833 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 2/r32/edx 4/disp8 . # copy *(esi+4) to edx + 834 # var twig/edi : (address slice) = {0, 0} 835 68/push 0/imm32/end 836 68/push 0/imm32/start - 837 89/copy 3/mod/direct 7/rm32/EDI . . . 4/r32/ESP . . # copy ESP to EDI + 837 89/copy 3/mod/direct 7/rm32/edi . . . 4/r32/esp . . # copy esp to edi 838 # next-token-from-slice(word->start, word->end, '/', twig) 839 # . . push args - 840 57/push-EDI + 840 57/push-edi 841 68/push 0x2f/imm32/slash - 842 52/push-EDX - 843 ff 6/subop/push 0/mod/indirect 6/rm32/ESI . . . . . . # push *ESI + 842 52/push-edx + 843 ff 6/subop/push 0/mod/indirect 6/rm32/esi . . . . . . # push *esi 844 # . . call 845 e8/call next-token-from-slice/disp32 846 # . . discard args - 847 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP - 848 # curr/ECX = twig->end - 849 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 1/r32/ECX 4/disp8 . # copy *(EDI+4) to ECX + 847 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp + 848 # curr/ecx = twig->end + 849 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 4/disp8 . # copy *(edi+4) to ecx 850 $has-metadata?:loop: 851 # next-token-from-slice(curr, word->end, '/', twig) 852 # . . push args - 853 57/push-EDI + 853 57/push-edi 854 68/push 0x2f/imm32/slash - 855 52/push-EDX - 856 51/push-ECX + 855 52/push-edx + 856 51/push-ecx 857 # . . call 858 e8/call next-token-from-slice/disp32 859 # . . discard args - 860 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP + 860 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp 861 # if (slice-empty?(twig)) return false - 862 # . EAX = slice-empty?(twig) + 862 # . eax = slice-empty?(twig) 863 # . . push args - 864 57/push-EDI + 864 57/push-edi 865 # . . call 866 e8/call slice-empty?/disp32 867 # . . discard args - 868 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - 869 # . if (EAX != 0) return false - 870 3d/compare-EAX-and 0/imm32 + 868 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + 869 # . if (eax != 0) return false + 870 3d/compare-eax-and 0/imm32 871 75/jump-if-not-equal $has-metadata?:false/disp8 872 # if (slice-equal?(twig, s)) return true - 873 # . EAX = slice-equal?(twig, s) + 873 # . eax = slice-equal?(twig, s) 874 # . . push args - 875 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12) - 876 57/push-EDI + 875 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 . # push *(ebp+12) + 876 57/push-edi 877 # . . call 878 e8/call slice-equal?/disp32 879 # . . discard args - 880 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 881 # . if (EAX != 0) return true - 882 3d/compare-EAX-and 0/imm32 + 880 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 881 # . if (eax != 0) return true + 882 3d/compare-eax-and 0/imm32 883 75/jump-if-not-equal $has-metadata?:true/disp8 884 # curr = twig->end - 885 8b/copy 1/mod/*+disp8 7/rm32/EDI . . . 1/r32/ECX 4/disp8 . # copy *(EDI+4) to ECX + 885 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 4/disp8 . # copy *(edi+4) to ecx 886 eb/jump $has-metadata?:loop/disp8 887 $has-metadata?:true: - 888 b8/copy-to-EAX 1/imm32/true + 888 b8/copy-to-eax 1/imm32/true 889 eb/jump $has-metadata?:end/disp8 890 $has-metadata?:false: - 891 b8/copy-to-EAX 0/imm32/false + 891 b8/copy-to-eax 0/imm32/false 892 $has-metadata?:end: 893 # . reclaim locals - 894 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + 894 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 895 # . restore registers - 896 5f/pop-to-EDI - 897 5e/pop-to-ESI - 898 5a/pop-to-EDX - 899 59/pop-to-ECX + 896 5f/pop-to-edi + 897 5e/pop-to-esi + 898 5a/pop-to-edx + 899 59/pop-to-ecx 900 # . epilog - 901 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 902 5d/pop-to-EBP + 901 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 902 5d/pop-to-ebp 903 c3/return 904 905 test-has-metadata-true: 906 # . prolog - 907 55/push-EBP - 908 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 909 # (EAX..ECX) = "ab/imm32" - 910 b8/copy-to-EAX "ab/imm32"/imm32 - 911 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 912 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 913 05/add-to-EAX 4/imm32 - 914 # var in/ESI : (address slice) = {EAX, ECX} - 915 51/push-ECX - 916 50/push-EAX - 917 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . . # copy ESP to ESI - 918 # EAX = has-metadata?(ESI, "imm32") + 907 55/push-ebp + 908 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 909 # (eax..ecx) = "ab/imm32" + 910 b8/copy-to-eax "ab/imm32"/imm32 + 911 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 912 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 913 05/add-to-eax 4/imm32 + 914 # var in/esi : (address slice) = {eax, ecx} + 915 51/push-ecx + 916 50/push-eax + 917 89/copy 3/mod/direct 6/rm32/esi . . . 4/r32/esp . . # copy esp to esi + 918 # eax = has-metadata?(esi, "imm32") 919 # . . push args 920 68/push "imm32"/imm32 - 921 56/push-ESI + 921 56/push-esi 922 # . . call 923 e8/call has-metadata?/disp32 924 # . . discard args - 925 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 926 # check-ints-equal(EAX, 1, msg) + 925 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 926 # check-ints-equal(eax, 1, msg) 927 # . . push args 928 68/push "F - test-has-metadata-true"/imm32 929 68/push 1/imm32/true - 930 50/push-EAX + 930 50/push-eax 931 # . . call 932 e8/call check-ints-equal/disp32 933 # . . discard args - 934 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 934 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 935 # . epilog - 936 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 937 5d/pop-to-EBP + 936 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 937 5d/pop-to-ebp 938 c3/return 939 940 test-has-metadata-false: 941 # . prolog - 942 55/push-EBP - 943 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 944 # (EAX..ECX) = "ab/c" - 945 b8/copy-to-EAX "ab/c"/imm32 - 946 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 947 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 948 05/add-to-EAX 4/imm32 - 949 # var in/ESI : (address slice) = {EAX, ECX} - 950 51/push-ECX - 951 50/push-EAX - 952 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . . # copy ESP to ESI - 953 # EAX = has-metadata?(ESI, "d") + 942 55/push-ebp + 943 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 944 # (eax..ecx) = "ab/c" + 945 b8/copy-to-eax "ab/c"/imm32 + 946 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 947 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 948 05/add-to-eax 4/imm32 + 949 # var in/esi : (address slice) = {eax, ecx} + 950 51/push-ecx + 951 50/push-eax + 952 89/copy 3/mod/direct 6/rm32/esi . . . 4/r32/esp . . # copy esp to esi + 953 # eax = has-metadata?(esi, "d") 954 # . . push args 955 68/push "d"/imm32 - 956 56/push-ESI + 956 56/push-esi 957 # . . call 958 e8/call has-metadata?/disp32 959 # . . discard args - 960 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 961 # check-ints-equal(EAX, 0, msg) + 960 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 961 # check-ints-equal(eax, 0, msg) 962 # . . push args 963 68/push "F - test-has-metadata-false"/imm32 964 68/push 0/imm32/false - 965 50/push-EAX + 965 50/push-eax 966 # . . call 967 e8/call check-ints-equal/disp32 968 # . . discard args - 969 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP + 969 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 970 # . epilog - 971 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP - 972 5d/pop-to-EBP + 971 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp + 972 5d/pop-to-ebp 973 c3/return 974 975 test-has-metadata-ignore-name: 976 # . prolog - 977 55/push-EBP - 978 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP - 979 # (EAX..ECX) = "a/b" - 980 b8/copy-to-EAX "a/b"/imm32 - 981 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX - 982 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX - 983 05/add-to-EAX 4/imm32 - 984 # var in/ESI : (address slice) = {EAX, ECX} - 985 51/push-ECX - 986 50/push-EAX - 987 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . . # copy ESP to ESI - 988 # EAX = has-metadata?(ESI, "a") + 977 55/push-ebp + 978 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp + 979 # (eax..ecx) = "a/b" + 980 b8/copy-to-eax "a/b"/imm32 + 981 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx + 982 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx + 983 05/add-to-eax 4/imm32 + 984 # var in/esi : (address slice) = {eax, ecx} + 985 51/push-ecx + 986 50/push-eax + 987 89/copy 3/mod/direct 6/rm32/esi . . . 4/r32/esp . . # copy esp to esi + 988 # eax = has-metadata?(esi, "a") 989 # . . push args 990 68/push "a"/imm32 - 991 56/push-ESI + 991 56/push-esi 992 # . . call 993 e8/call has-metadata?/disp32 994 # . . discard args - 995 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - 996 # check-ints-equal(EAX, 0, msg) + 995 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + 996 # check-ints-equal(eax, 0, msg) 997 # . . push args 998 68/push "F - test-has-metadata-ignore-name"/imm32 999 68/push 0/imm32/false -1000 50/push-EAX +1000 50/push-eax 1001 # . . call 1002 e8/call check-ints-equal/disp32 1003 # . . discard args -1004 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1004 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1005 # . epilog -1006 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1007 5d/pop-to-EBP +1006 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1007 5d/pop-to-ebp 1008 c3/return 1009 1010 test-has-metadata-multiple-true: 1011 # . prolog -1012 55/push-EBP -1013 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1014 # (EAX..ECX) = "a/b/c" -1015 b8/copy-to-EAX "a/b/c"/imm32 -1016 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1017 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1018 05/add-to-EAX 4/imm32 -1019 # var in/ESI : (address slice) = {EAX, ECX} -1020 51/push-ECX -1021 50/push-EAX -1022 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . . # copy ESP to ESI -1023 # EAX = has-metadata?(ESI, "c") +1012 55/push-ebp +1013 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1014 # (eax..ecx) = "a/b/c" +1015 b8/copy-to-eax "a/b/c"/imm32 +1016 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1017 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1018 05/add-to-eax 4/imm32 +1019 # var in/esi : (address slice) = {eax, ecx} +1020 51/push-ecx +1021 50/push-eax +1022 89/copy 3/mod/direct 6/rm32/esi . . . 4/r32/esp . . # copy esp to esi +1023 # eax = has-metadata?(esi, "c") 1024 # . . push args 1025 68/push "c"/imm32 -1026 56/push-ESI +1026 56/push-esi 1027 # . . call 1028 e8/call has-metadata?/disp32 1029 # . . discard args -1030 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -1031 # check-ints-equal(EAX, 1, msg) +1030 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +1031 # check-ints-equal(eax, 1, msg) 1032 # . . push args 1033 68/push "F - test-has-metadata-multiple-true"/imm32 1034 68/push 1/imm32/true -1035 50/push-EAX +1035 50/push-eax 1036 # . . call 1037 e8/call check-ints-equal/disp32 1038 # . . discard args -1039 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1039 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1040 # . epilog -1041 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1042 5d/pop-to-EBP +1041 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1042 5d/pop-to-ebp 1043 c3/return 1044 1045 test-has-metadata-multiple-false: 1046 # . prolog -1047 55/push-EBP -1048 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1049 # (EAX..ECX) = "a/b/c" -1050 b8/copy-to-EAX "a/b/c"/imm32 -1051 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1052 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1053 05/add-to-EAX 4/imm32 -1054 # var in/ESI : (address slice) = {EAX, ECX} -1055 51/push-ECX -1056 50/push-EAX -1057 89/copy 3/mod/direct 6/rm32/ESI . . . 4/r32/ESP . . # copy ESP to ESI -1058 # EAX = has-metadata?(ESI, "d") +1047 55/push-ebp +1048 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1049 # (eax..ecx) = "a/b/c" +1050 b8/copy-to-eax "a/b/c"/imm32 +1051 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1052 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1053 05/add-to-eax 4/imm32 +1054 # var in/esi : (address slice) = {eax, ecx} +1055 51/push-ecx +1056 50/push-eax +1057 89/copy 3/mod/direct 6/rm32/esi . . . 4/r32/esp . . # copy esp to esi +1058 # eax = has-metadata?(esi, "d") 1059 # . . push args 1060 68/push "d"/imm32 -1061 56/push-ESI +1061 56/push-esi 1062 # . . call 1063 e8/call has-metadata?/disp32 1064 # . . discard args -1065 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -1066 # check-ints-equal(EAX, 0, msg) +1065 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +1066 # check-ints-equal(eax, 0, msg) 1067 # . . push args 1068 68/push "F - test-has-metadata-multiple-false"/imm32 1069 68/push 0/imm32/false -1070 50/push-EAX +1070 50/push-eax 1071 # . . call 1072 e8/call check-ints-equal/disp32 1073 # . . discard args -1074 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1074 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1075 # . epilog -1076 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1077 5d/pop-to-EBP +1076 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1077 5d/pop-to-ebp 1078 c3/return 1079 1080 # If datum of 'word' is not a valid name, it must be a hex int. Parse and print @@ -1146,56 +1146,56 @@ if ('onhashchange' in window) { 1083 # Always print a trailing space. 1084 emit: # out : (address buffered-file), word : (address slice), width : int -> <void> 1085 # . prolog -1086 55/push-EBP -1087 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1086 55/push-ebp +1087 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1088 # . save registers -1089 50/push-EAX -1090 56/push-ESI -1091 57/push-EDI -1092 # ESI = word -1093 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 0xc/disp8 . # copy *(EBP+12) to ESI -1094 # var name/EDI : (address slice) = {0, 0} +1089 50/push-eax +1090 56/push-esi +1091 57/push-edi +1092 # esi = word +1093 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 0xc/disp8 . # copy *(ebp+12) to esi +1094 # var name/edi : (address slice) = {0, 0} 1095 68/push 0/imm32/end 1096 68/push 0/imm32/start -1097 89/copy 3/mod/direct 7/rm32/EDI . . . 4/r32/ESP . . # copy ESP to EDI +1097 89/copy 3/mod/direct 7/rm32/edi . . . 4/r32/esp . . # copy esp to edi 1098 # datum = next-token-from-slice(word->start, word->end, '/') 1099 # . . push args -1100 57/push-EDI +1100 57/push-edi 1101 68/push 0x2f/imm32/slash -1102 ff 6/subop/push 1/mod/*+disp8 6/rm32/ESI . . . . 4/disp8 . # push *(ESI+4) -1103 ff 6/subop/push 0/mod/indirect 6/rm32/ESI . . . . . . # push *ESI +1102 ff 6/subop/push 1/mod/*+disp8 6/rm32/esi . . . . 4/disp8 . # push *(esi+4) +1103 ff 6/subop/push 0/mod/indirect 6/rm32/esi . . . . . . # push *esi 1104 # . . call 1105 e8/call next-token-from-slice/disp32 1106 # . . discard args -1107 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0x10/imm32 # add to ESP +1107 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0x10/imm32 # add to esp 1108 # if (is-valid-name?(datum)) write-slice-buffered(out, word) and return -1109 # . EAX = is-valid-name?(name) +1109 # . eax = is-valid-name?(name) 1110 # . . push args -1111 57/push-EDI +1111 57/push-edi 1112 # . . call 1113 e8/call is-valid-name?/disp32 1114 # . . discard args -1115 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1116 # . if (EAX != 0) -1117 3d/compare-EAX-and 0/imm32 +1115 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1116 # . if (eax != 0) +1117 3d/compare-eax-and 0/imm32 1118 74/jump-if-equal $emit:hex-int/disp8 1119 $emit:name: 1120 # . write-slice-buffered(out, word) 1121 # . . push args -1122 56/push-ESI -1123 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) +1122 56/push-esi +1123 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 1124 # . . call 1125 e8/call write-slice-buffered/disp32 1126 # . . discard args -1127 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +1127 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 1128 # . write-buffered(out, " ") 1129 # . . push args 1130 68/push " "/imm32 -1131 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) +1131 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 1132 # . . call 1133 e8/call write-buffered/disp32 1134 # . . discard args -1135 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +1135 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 1136 # . return 1137 eb/jump $emit:end/disp8 1138 # otherwise emit-hex(out, parse-hex-int(datum), width) @@ -1204,38 +1204,38 @@ if ('onhashchange' in window) { 1141 # programs. We just want to make sure that valid names aren't treated as 1142 # (valid) hex numbers.) 1143 $emit:hex-int: -1144 # . value/EAX = parse-hex-int(datum) +1144 # . value/eax = parse-hex-int(datum) 1145 # . . push args -1146 57/push-EDI +1146 57/push-edi 1147 # . . call 1148 e8/call parse-hex-int/disp32 1149 # . . discard args -1150 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1150 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1151 # . emit-hex(out, value, width) 1152 # . . push args -1153 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0x10/disp8 . # push *(EBP+16) -1154 50/push-EAX -1155 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) +1153 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 0x10/disp8 . # push *(ebp+16) +1154 50/push-eax +1155 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 1156 # . . call 1157 e8/call emit-hex/disp32 1158 # . . discard args -1159 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1159 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1160 $emit:end: 1161 # . reclaim locals -1162 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +1162 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 1163 # . restore registers -1164 5f/pop-to-EDI -1165 5e/pop-to-ESI -1166 58/pop-to-EAX +1164 5f/pop-to-edi +1165 5e/pop-to-esi +1166 58/pop-to-eax 1167 # . epilog -1168 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1169 5d/pop-to-EBP +1168 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1169 5d/pop-to-ebp 1170 c3/return 1171 1172 test-emit-number: 1173 # . prolog -1174 55/push-EBP -1175 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1174 55/push-ebp +1175 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1176 # setup 1177 # . clear-stream(_test-output-stream) 1178 # . . push args @@ -1243,41 +1243,41 @@ if ('onhashchange' in window) { 1180 # . . call 1181 e8/call clear-stream/disp32 1182 # . . discard args -1183 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1183 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1184 # . clear-stream(_test-output-buffered-file+4) 1185 # . . push args -1186 b8/copy-to-EAX _test-output-buffered-file/imm32 -1187 05/add-to-EAX 4/imm32 -1188 50/push-EAX +1186 b8/copy-to-eax _test-output-buffered-file/imm32 +1187 05/add-to-eax 4/imm32 +1188 50/push-eax 1189 # . . call 1190 e8/call clear-stream/disp32 1191 # . . discard args -1192 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1193 # (EAX..ECX) = "30" -1194 b8/copy-to-EAX "30"/imm32 -1195 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1196 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1197 05/add-to-EAX 4/imm32 -1198 # var slice/ECX = {EAX, ECX} -1199 51/push-ECX -1200 50/push-EAX -1201 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +1192 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1193 # (eax..ecx) = "30" +1194 b8/copy-to-eax "30"/imm32 +1195 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1196 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1197 05/add-to-eax 4/imm32 +1198 # var slice/ecx = {eax, ecx} +1199 51/push-ecx +1200 50/push-eax +1201 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 1202 # emit(_test-output-buffered-file, slice, 1) 1203 # . . push args 1204 68/push 1/imm32 -1205 51/push-ECX +1205 51/push-ecx 1206 68/push _test-output-buffered-file/imm32 1207 # . . call 1208 e8/call emit/disp32 1209 # . . discard args -1210 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1210 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1211 # flush(_test-output-buffered-file) 1212 # . . push args 1213 68/push _test-output-buffered-file/imm32 1214 # . . call 1215 e8/call flush/disp32 1216 # . . discard args -1217 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1217 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1218 # check-stream-equal(_test-output-stream, "30 ", msg) 1219 # . . push args 1220 68/push "F - test-emit-number/1"/imm32 @@ -1286,17 +1286,17 @@ if ('onhashchange' in window) { 1223 # . . call 1224 e8/call check-stream-equal/disp32 1225 # . . discard args -1226 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1226 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1227 # . epilog -1228 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1229 5d/pop-to-EBP +1228 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1229 5d/pop-to-ebp 1230 c3/return 1231 1232 test-emit-negative-number: 1233 # test support for sign-extending negative numbers 1234 # . prolog -1235 55/push-EBP -1236 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1235 55/push-ebp +1236 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1237 # setup 1238 # . clear-stream(_test-output-stream) 1239 # . . push args @@ -1304,41 +1304,41 @@ if ('onhashchange' in window) { 1241 # . . call 1242 e8/call clear-stream/disp32 1243 # . . discard args -1244 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1244 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1245 # . clear-stream(_test-output-buffered-file+4) 1246 # . . push args -1247 b8/copy-to-EAX _test-output-buffered-file/imm32 -1248 05/add-to-EAX 4/imm32 -1249 50/push-EAX +1247 b8/copy-to-eax _test-output-buffered-file/imm32 +1248 05/add-to-eax 4/imm32 +1249 50/push-eax 1250 # . . call 1251 e8/call clear-stream/disp32 1252 # . . discard args -1253 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1254 # (EAX..ECX) = "-2" -1255 b8/copy-to-EAX "-2"/imm32 -1256 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1257 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1258 05/add-to-EAX 4/imm32 -1259 # var slice/ECX = {EAX, ECX} -1260 51/push-ECX -1261 50/push-EAX -1262 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +1253 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1254 # (eax..ecx) = "-2" +1255 b8/copy-to-eax "-2"/imm32 +1256 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1257 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1258 05/add-to-eax 4/imm32 +1259 # var slice/ecx = {eax, ecx} +1260 51/push-ecx +1261 50/push-eax +1262 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 1263 # emit(_test-output-buffered-file, slice, 2) 1264 # . . push args 1265 68/push 2/imm32 -1266 51/push-ECX +1266 51/push-ecx 1267 68/push _test-output-buffered-file/imm32 1268 # . . call 1269 e8/call emit/disp32 1270 # . . discard args -1271 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1271 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1272 # flush(_test-output-buffered-file) 1273 # . . push args 1274 68/push _test-output-buffered-file/imm32 1275 # . . call 1276 e8/call flush/disp32 1277 # . . discard args -1278 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1278 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1279 # check-stream-equal(_test-output-stream, "fe ff ", msg) 1280 # . . push args 1281 68/push "F - test-emit-number/1"/imm32 @@ -1347,16 +1347,16 @@ if ('onhashchange' in window) { 1284 # . . call 1285 e8/call check-stream-equal/disp32 1286 # . . discard args -1287 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1287 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1288 # . epilog -1289 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1290 5d/pop-to-EBP +1289 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1290 5d/pop-to-ebp 1291 c3/return 1292 1293 test-emit-number-with-metadata: 1294 # . prolog -1295 55/push-EBP -1296 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1295 55/push-ebp +1296 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1297 # setup 1298 # . clear-stream(_test-output-stream) 1299 # . . push args @@ -1364,41 +1364,41 @@ if ('onhashchange' in window) { 1301 # . . call 1302 e8/call clear-stream/disp32 1303 # . . discard args -1304 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1304 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1305 # . clear-stream(_test-output-buffered-file+4) 1306 # . . push args -1307 b8/copy-to-EAX _test-output-buffered-file/imm32 -1308 05/add-to-EAX 4/imm32 -1309 50/push-EAX +1307 b8/copy-to-eax _test-output-buffered-file/imm32 +1308 05/add-to-eax 4/imm32 +1309 50/push-eax 1310 # . . call 1311 e8/call clear-stream/disp32 1312 # . . discard args -1313 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1314 # (EAX..ECX) = "-2/foo" -1315 b8/copy-to-EAX "-2/foo"/imm32 -1316 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1317 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1318 05/add-to-EAX 4/imm32 -1319 # var slice/ECX = {EAX, ECX} -1320 51/push-ECX -1321 50/push-EAX -1322 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +1313 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1314 # (eax..ecx) = "-2/foo" +1315 b8/copy-to-eax "-2/foo"/imm32 +1316 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1317 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1318 05/add-to-eax 4/imm32 +1319 # var slice/ecx = {eax, ecx} +1320 51/push-ecx +1321 50/push-eax +1322 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 1323 # emit(_test-output-buffered-file, slice, 2) 1324 # . . push args 1325 68/push 2/imm32 -1326 51/push-ECX +1326 51/push-ecx 1327 68/push _test-output-buffered-file/imm32 1328 # . . call 1329 e8/call emit/disp32 1330 # . . discard args -1331 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1331 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1332 # flush(_test-output-buffered-file) 1333 # . . push args 1334 68/push _test-output-buffered-file/imm32 1335 # . . call 1336 e8/call flush/disp32 1337 # . . discard args -1338 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1338 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1339 # the '/foo' will have no impact on the output 1340 # check-stream-equal(_test-output-stream, "fe ff ", msg) 1341 # . . push args @@ -1408,16 +1408,16 @@ if ('onhashchange' in window) { 1345 # . . call 1346 e8/call check-stream-equal/disp32 1347 # . . discard args -1348 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1348 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1349 # . epilog -1350 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1351 5d/pop-to-EBP +1350 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1351 5d/pop-to-ebp 1352 c3/return 1353 1354 test-emit-non-number: 1355 # . prolog -1356 55/push-EBP -1357 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1356 55/push-ebp +1357 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1358 # setup 1359 # . clear-stream(_test-output-stream) 1360 # . . push args @@ -1425,41 +1425,41 @@ if ('onhashchange' in window) { 1362 # . . call 1363 e8/call clear-stream/disp32 1364 # . . discard args -1365 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1365 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1366 # . clear-stream(_test-output-buffered-file+4) 1367 # . . push args -1368 b8/copy-to-EAX _test-output-buffered-file/imm32 -1369 05/add-to-EAX 4/imm32 -1370 50/push-EAX +1368 b8/copy-to-eax _test-output-buffered-file/imm32 +1369 05/add-to-eax 4/imm32 +1370 50/push-eax 1371 # . . call 1372 e8/call clear-stream/disp32 1373 # . . discard args -1374 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1375 # (EAX..ECX) = "xyz" -1376 b8/copy-to-EAX "xyz"/imm32 -1377 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1378 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1379 05/add-to-EAX 4/imm32 -1380 # var slice/ECX = {EAX, ECX} -1381 51/push-ECX -1382 50/push-EAX -1383 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +1374 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1375 # (eax..ecx) = "xyz" +1376 b8/copy-to-eax "xyz"/imm32 +1377 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1378 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1379 05/add-to-eax 4/imm32 +1380 # var slice/ecx = {eax, ecx} +1381 51/push-ecx +1382 50/push-eax +1383 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 1384 # emit(_test-output-buffered-file, slice, 2) 1385 # . . push args 1386 68/push 2/imm32 -1387 51/push-ECX +1387 51/push-ecx 1388 68/push _test-output-buffered-file/imm32 1389 # . . call 1390 e8/call emit/disp32 1391 # . . discard args -1392 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1392 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1393 # flush(_test-output-buffered-file) 1394 # . . push args 1395 68/push _test-output-buffered-file/imm32 1396 # . . call 1397 e8/call flush/disp32 1398 # . . discard args -1399 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1399 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1400 # check-stream-equal(_test-output-stream, "xyz", msg) 1401 # . . push args 1402 68/push "F - test-emit-non-number"/imm32 @@ -1468,16 +1468,16 @@ if ('onhashchange' in window) { 1405 # . . call 1406 e8/call check-stream-equal/disp32 1407 # . . discard args -1408 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1408 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1409 # . epilog -1410 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1411 5d/pop-to-EBP +1410 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1411 5d/pop-to-ebp 1412 c3/return 1413 1414 test-emit-non-number-with-metadata: 1415 # . prolog -1416 55/push-EBP -1417 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1416 55/push-ebp +1417 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1418 # setup 1419 # . clear-stream(_test-output-stream) 1420 # . . push args @@ -1485,41 +1485,41 @@ if ('onhashchange' in window) { 1422 # . . call 1423 e8/call clear-stream/disp32 1424 # . . discard args -1425 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1425 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1426 # . clear-stream(_test-output-buffered-file+4) 1427 # . . push args -1428 b8/copy-to-EAX _test-output-buffered-file/imm32 -1429 05/add-to-EAX 4/imm32 -1430 50/push-EAX +1428 b8/copy-to-eax _test-output-buffered-file/imm32 +1429 05/add-to-eax 4/imm32 +1430 50/push-eax 1431 # . . call 1432 e8/call clear-stream/disp32 1433 # . . discard args -1434 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1435 # (EAX..ECX) = "xyz/" -1436 b8/copy-to-EAX "xyz/"/imm32 -1437 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1438 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1439 05/add-to-EAX 4/imm32 -1440 # var slice/ECX = {EAX, ECX} -1441 51/push-ECX -1442 50/push-EAX -1443 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +1434 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1435 # (eax..ecx) = "xyz/" +1436 b8/copy-to-eax "xyz/"/imm32 +1437 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1438 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1439 05/add-to-eax 4/imm32 +1440 # var slice/ecx = {eax, ecx} +1441 51/push-ecx +1442 50/push-eax +1443 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 1444 # emit(_test-output-buffered-file, slice, 2) 1445 # . . push args 1446 68/push 2/imm32 -1447 51/push-ECX +1447 51/push-ecx 1448 68/push _test-output-buffered-file/imm32 1449 # . . call 1450 e8/call emit/disp32 1451 # . . discard args -1452 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1452 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1453 # flush(_test-output-buffered-file) 1454 # . . push args 1455 68/push _test-output-buffered-file/imm32 1456 # . . call 1457 e8/call flush/disp32 1458 # . . discard args -1459 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1459 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1460 # check-stream-equal(_test-output-stream, "xyz/", msg) 1461 # . . push args 1462 68/push "F - test-emit-non-number-with-metadata"/imm32 @@ -1528,16 +1528,16 @@ if ('onhashchange' in window) { 1465 # . . call 1466 e8/call check-stream-equal/disp32 1467 # . . discard args -1468 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1468 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1469 # . epilog -1470 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1471 5d/pop-to-EBP +1470 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1471 5d/pop-to-ebp 1472 c3/return 1473 1474 test-emit-non-number-with-all-hex-digits-and-metadata: 1475 # . prolog -1476 55/push-EBP -1477 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1476 55/push-ebp +1477 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1478 # setup 1479 # . clear-stream(_test-output-stream) 1480 # . . push args @@ -1545,41 +1545,41 @@ if ('onhashchange' in window) { 1482 # . . call 1483 e8/call clear-stream/disp32 1484 # . . discard args -1485 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1485 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1486 # . clear-stream(_test-output-buffered-file+4) 1487 # . . push args -1488 b8/copy-to-EAX _test-output-buffered-file/imm32 -1489 05/add-to-EAX 4/imm32 -1490 50/push-EAX +1488 b8/copy-to-eax _test-output-buffered-file/imm32 +1489 05/add-to-eax 4/imm32 +1490 50/push-eax 1491 # . . call 1492 e8/call clear-stream/disp32 1493 # . . discard args -1494 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1495 # (EAX..ECX) = "abcd/xyz" -1496 b8/copy-to-EAX "abcd/xyz"/imm32 -1497 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1498 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1499 05/add-to-EAX 4/imm32 -1500 # var slice/ECX = {EAX, ECX} -1501 51/push-ECX -1502 50/push-EAX -1503 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +1494 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1495 # (eax..ecx) = "abcd/xyz" +1496 b8/copy-to-eax "abcd/xyz"/imm32 +1497 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1498 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1499 05/add-to-eax 4/imm32 +1500 # var slice/ecx = {eax, ecx} +1501 51/push-ecx +1502 50/push-eax +1503 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 1504 # emit(_test-output-buffered-file, slice, 2) 1505 # . . push args 1506 68/push 2/imm32 -1507 51/push-ECX +1507 51/push-ecx 1508 68/push _test-output-buffered-file/imm32 1509 # . . call 1510 e8/call emit/disp32 1511 # . . discard args -1512 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1512 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1513 # flush(_test-output-buffered-file) 1514 # . . push args 1515 68/push _test-output-buffered-file/imm32 1516 # . . call 1517 e8/call flush/disp32 1518 # . . discard args -1519 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1519 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1520 +-- 26 lines: #? # dump output --------------------------------------------------------------------------------------------------------------------------- 1546 # check-stream-equal(_test-output-stream, "abcd/xyz") 1547 # . . push args @@ -1589,10 +1589,10 @@ if ('onhashchange' in window) { 1551 # . . call 1552 e8/call check-stream-equal/disp32 1553 # . . discard args -1554 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1554 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1555 # . epilog -1556 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1557 5d/pop-to-EBP +1556 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1557 5d/pop-to-ebp 1558 c3/return 1559 1560 # conditions for 'valid' names that are not at risk of looking like hex numbers @@ -1603,319 +1603,319 @@ if ('onhashchange' in window) { 1565 #: - if it starts with '0x' it's treated as a number. (redundant) 1566 #: - if it's two characters long, it can't be a name. Either it's a hex 1567 #: byte, or it raises an error. -1568 is-valid-name?: # in : (address slice) -> EAX : boolean +1568 is-valid-name?: # in : (address slice) -> eax : boolean 1569 # . prolog -1570 55/push-EBP -1571 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1570 55/push-ebp +1571 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1572 # . save registers -1573 51/push-ECX -1574 56/push-ESI -1575 # ESI = in -1576 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI -1577 # start/ECX = in->start -1578 8b/copy 0/mod/indirect 6/rm32/ESI . . . 1/r32/ECX . . # copy *ESI to ECX -1579 # end/EAX = in->end -1580 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 0/r32/EAX 4/disp8 . # copy *(ESI+4) to EAX +1573 51/push-ecx +1574 56/push-esi +1575 # esi = in +1576 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi +1577 # start/ecx = in->start +1578 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # copy *esi to ecx +1579 # end/eax = in->end +1580 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 0/r32/eax 4/disp8 . # copy *(esi+4) to eax 1581 $is-valid-name?:check0: 1582 # if (start >= end) return false -1583 39/compare 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # compare ECX with EAX +1583 39/compare 3/mod/direct 1/rm32/ecx . . . 0/r32/eax . . # compare ecx with eax 1584 73/jump-if-greater-or-equal-unsigned $is-valid-name?:false/disp8 1585 $is-valid-name?:check1: -1586 # EAX -= ECX -1587 29/subtract 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # subtract ECX from EAX -1588 # if (EAX == 2) return false -1589 3d/compare-EAX-and 2/imm32 +1586 # eax -= ecx +1587 29/subtract 3/mod/direct 0/rm32/eax . . . 1/r32/ecx . . # subtract ecx from eax +1588 # if (eax == 2) return false +1589 3d/compare-eax-and 2/imm32 1590 74/jump-if-equal $is-valid-name?:false/disp8 1591 $is-valid-name?:check2: -1592 # c/EAX = *ECX -1593 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX -1594 8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy byte at *ECX to AL +1592 # c/eax = *ecx +1593 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax +1594 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . . # copy byte at *ecx to AL 1595 # if (c == "-") return false -1596 3d/compare-EAX-and 2d/imm32/- +1596 3d/compare-eax-and 2d/imm32/- 1597 74/jump-if-equal $is-valid-name?:false/disp8 1598 $is-valid-name?:check3a: 1599 # if (c < "0") return true -1600 3d/compare-EAX-with 30/imm32/0 +1600 3d/compare-eax-with 30/imm32/0 1601 7c/jump-if-lesser $is-valid-name?:true/disp8 1602 $is-valid-name?:check3b: 1603 # if (c > "9") return true -1604 3d/compare-EAX-with 39/imm32/9 +1604 3d/compare-eax-with 39/imm32/9 1605 7f/jump-if-greater $is-valid-name?:true/disp8 1606 $is-valid-name?:false: 1607 # return false -1608 b8/copy-to-EAX 0/imm32/false +1608 b8/copy-to-eax 0/imm32/false 1609 eb/jump $is-valid-name?:end/disp8 1610 $is-valid-name?:true: 1611 # return true -1612 b8/copy-to-EAX 1/imm32/true +1612 b8/copy-to-eax 1/imm32/true 1613 $is-valid-name?:end: 1614 # . restore registers -1615 5e/pop-to-ESI -1616 59/pop-to-ECX +1615 5e/pop-to-esi +1616 59/pop-to-ecx 1617 # . epilog -1618 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1619 5d/pop-to-EBP +1618 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1619 5d/pop-to-ebp 1620 c3/return 1621 1622 test-is-valid-name-digit-prefix: 1623 # . prolog -1624 55/push-EBP -1625 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1626 # (EAX..ECX) = "34" -1627 b8/copy-to-EAX "34"/imm32 -1628 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1629 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1630 05/add-to-EAX 4/imm32 -1631 # var slice/ECX = {EAX, ECX} -1632 51/push-ECX -1633 50/push-EAX -1634 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -1635 # EAX = is-valid-name?(slice) +1624 55/push-ebp +1625 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1626 # (eax..ecx) = "34" +1627 b8/copy-to-eax "34"/imm32 +1628 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1629 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1630 05/add-to-eax 4/imm32 +1631 # var slice/ecx = {eax, ecx} +1632 51/push-ecx +1633 50/push-eax +1634 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +1635 # eax = is-valid-name?(slice) 1636 # . . push args -1637 51/push-ECX +1637 51/push-ecx 1638 # . . call 1639 e8/call is-valid-name?/disp32 1640 # . . discard args -1641 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1642 # check-ints-equal(EAX, 0, msg) +1641 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1642 # check-ints-equal(eax, 0, msg) 1643 # . . push args 1644 68/push "F - test-is-valid-name-digit-prefix"/imm32 1645 68/push 0/imm32/false -1646 50/push-EAX +1646 50/push-eax 1647 # . . call 1648 e8/call check-ints-equal/disp32 1649 # . . discard args -1650 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1650 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1651 # . epilog -1652 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1653 5d/pop-to-EBP +1652 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1653 5d/pop-to-ebp 1654 c3/return 1655 1656 test-is-valid-name-negative-prefix: 1657 # . prolog -1658 55/push-EBP -1659 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1660 # (EAX..ECX) = "-0x34" -1661 b8/copy-to-EAX "-0x34"/imm32 -1662 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1663 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1664 05/add-to-EAX 4/imm32 -1665 # var slice/ECX = {EAX, ECX} -1666 51/push-ECX -1667 50/push-EAX -1668 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -1669 # EAX = is-valid-name?(slice) +1658 55/push-ebp +1659 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1660 # (eax..ecx) = "-0x34" +1661 b8/copy-to-eax "-0x34"/imm32 +1662 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1663 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1664 05/add-to-eax 4/imm32 +1665 # var slice/ecx = {eax, ecx} +1666 51/push-ecx +1667 50/push-eax +1668 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +1669 # eax = is-valid-name?(slice) 1670 # . . push args -1671 51/push-ECX +1671 51/push-ecx 1672 # . . call 1673 e8/call is-valid-name?/disp32 1674 # . . discard args -1675 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1676 # check-ints-equal(EAX, 0, msg) +1675 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1676 # check-ints-equal(eax, 0, msg) 1677 # . . push args 1678 68/push "F - test-is-valid-name-negative-prefix"/imm32 1679 68/push 0/imm32/false -1680 50/push-EAX +1680 50/push-eax 1681 # . . call 1682 e8/call check-ints-equal/disp32 1683 # . . discard args -1684 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1684 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1685 # . epilog -1686 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1687 5d/pop-to-EBP +1686 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1687 5d/pop-to-ebp 1688 c3/return 1689 1690 test-is-valid-name-0x-prefix: 1691 # . prolog -1692 55/push-EBP -1693 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1694 # (EAX..ECX) = "0x34" -1695 b8/copy-to-EAX "0x34"/imm32 -1696 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1697 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1698 05/add-to-EAX 4/imm32 -1699 # var slice/ECX = {EAX, ECX} -1700 51/push-ECX -1701 50/push-EAX -1702 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -1703 # EAX = is-valid-name?(slice) +1692 55/push-ebp +1693 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1694 # (eax..ecx) = "0x34" +1695 b8/copy-to-eax "0x34"/imm32 +1696 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1697 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1698 05/add-to-eax 4/imm32 +1699 # var slice/ecx = {eax, ecx} +1700 51/push-ecx +1701 50/push-eax +1702 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +1703 # eax = is-valid-name?(slice) 1704 # . . push args -1705 51/push-ECX +1705 51/push-ecx 1706 # . . call 1707 e8/call is-valid-name?/disp32 1708 # . . discard args -1709 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1710 # check-ints-equal(EAX, 0, msg) +1709 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1710 # check-ints-equal(eax, 0, msg) 1711 # . . push args 1712 68/push "F - test-is-valid-name-0x-prefix"/imm32 1713 68/push 0/imm32/false -1714 50/push-EAX +1714 50/push-eax 1715 # . . call 1716 e8/call check-ints-equal/disp32 1717 # . . discard args -1718 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1718 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1719 # . epilog -1720 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1721 5d/pop-to-EBP +1720 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1721 5d/pop-to-ebp 1722 c3/return 1723 1724 test-is-valid-name-starts-with-pre-digit: 1725 # . prolog -1726 55/push-EBP -1727 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1728 # (EAX..ECX) = "/03" -1729 b8/copy-to-EAX "/03"/imm32 -1730 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1731 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1732 05/add-to-EAX 4/imm32 -1733 # var slice/ECX = {EAX, ECX} -1734 51/push-ECX -1735 50/push-EAX -1736 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -1737 # EAX = is-valid-name?(slice) +1726 55/push-ebp +1727 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1728 # (eax..ecx) = "/03" +1729 b8/copy-to-eax "/03"/imm32 +1730 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1731 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1732 05/add-to-eax 4/imm32 +1733 # var slice/ecx = {eax, ecx} +1734 51/push-ecx +1735 50/push-eax +1736 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +1737 # eax = is-valid-name?(slice) 1738 # . . push args -1739 51/push-ECX +1739 51/push-ecx 1740 # . . call 1741 e8/call is-valid-name?/disp32 1742 # . . discard args -1743 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1744 # check-ints-equal(EAX, 1, msg) +1743 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1744 # check-ints-equal(eax, 1, msg) 1745 # . . push args 1746 68/push "F - test-is-valid-name-starts-with-pre-digit"/imm32 1747 68/push 1/imm32/true -1748 50/push-EAX +1748 50/push-eax 1749 # . . call 1750 e8/call check-ints-equal/disp32 1751 # . . discard args -1752 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1752 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1753 # . epilog -1754 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1755 5d/pop-to-EBP +1754 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1755 5d/pop-to-ebp 1756 c3/return 1757 1758 test-is-valid-name-starts-with-post-digit: 1759 # . prolog -1760 55/push-EBP -1761 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1762 # (EAX..ECX) = "q34" -1763 b8/copy-to-EAX "q34"/imm32 -1764 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1765 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1766 05/add-to-EAX 4/imm32 -1767 # var slice/ECX = {EAX, ECX} -1768 51/push-ECX -1769 50/push-EAX -1770 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -1771 # EAX = is-valid-name?(slice) +1760 55/push-ebp +1761 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1762 # (eax..ecx) = "q34" +1763 b8/copy-to-eax "q34"/imm32 +1764 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1765 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1766 05/add-to-eax 4/imm32 +1767 # var slice/ecx = {eax, ecx} +1768 51/push-ecx +1769 50/push-eax +1770 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +1771 # eax = is-valid-name?(slice) 1772 # . . push args -1773 51/push-ECX +1773 51/push-ecx 1774 # . . call 1775 e8/call is-valid-name?/disp32 1776 # . . discard args -1777 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1778 # check-ints-equal(EAX, 1, msg) +1777 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1778 # check-ints-equal(eax, 1, msg) 1779 # . . push args 1780 68/push "F - test-is-valid-name-starts-with-post-digit"/imm32 1781 68/push 1/imm32/true -1782 50/push-EAX +1782 50/push-eax 1783 # . . call 1784 e8/call check-ints-equal/disp32 1785 # . . discard args -1786 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1786 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1787 # . epilog -1788 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1789 5d/pop-to-EBP +1788 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1789 5d/pop-to-ebp 1790 c3/return 1791 1792 test-is-valid-name-starts-with-digit: 1793 # . prolog -1794 55/push-EBP -1795 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -1796 # (EAX..ECX) = "0x34" -1797 b8/copy-to-EAX "0x34"/imm32 -1798 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -1799 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -1800 05/add-to-EAX 4/imm32 -1801 # var slice/ECX = {EAX, ECX} -1802 51/push-ECX -1803 50/push-EAX -1804 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -1805 # EAX = is-valid-name?(slice) +1794 55/push-ebp +1795 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +1796 # (eax..ecx) = "0x34" +1797 b8/copy-to-eax "0x34"/imm32 +1798 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +1799 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +1800 05/add-to-eax 4/imm32 +1801 # var slice/ecx = {eax, ecx} +1802 51/push-ecx +1803 50/push-eax +1804 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +1805 # eax = is-valid-name?(slice) 1806 # . . push args -1807 51/push-ECX +1807 51/push-ecx 1808 # . . call 1809 e8/call is-valid-name?/disp32 1810 # . . discard args -1811 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -1812 # check-ints-equal(EAX, 0, msg) +1811 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +1812 # check-ints-equal(eax, 0, msg) 1813 # . . push args 1814 68/push "F - test-is-valid-name-starts-with-digit"/imm32 1815 68/push 0/imm32/false -1816 50/push-EAX +1816 50/push-eax 1817 # . . call 1818 e8/call check-ints-equal/disp32 1819 # . . discard args -1820 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1820 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1821 # . epilog -1822 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1823 5d/pop-to-EBP +1822 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1823 5d/pop-to-ebp 1824 c3/return 1825 1826 # print 'n' in hex in 'width' bytes in lower-endian order, with a space after every byte 1827 emit-hex: # out : (address buffered-file), n : int, width : int -> <void> 1828 # . prolog -1829 55/push-EBP -1830 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +1829 55/push-ebp +1830 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 1831 # . save registers -1832 50/push-EAX -1833 51/push-ECX -1834 52/push-EDX -1835 53/push-EBX -1836 57/push-EDI -1837 # EDI = out -1838 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI -1839 # EBX = n -1840 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 3/r32/EBX 0xc/disp8 . # copy *(EBP+12) to EBX -1841 # EDX = width -1842 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0x10/disp8 . # copy *(EBP+16) to EDX -1843 # var curr/ECX = 0 -1844 31/xor 3/mod/direct 1/rm32/ECX . . . 1/r32/ECX . . # clear ECX +1832 50/push-eax +1833 51/push-ecx +1834 52/push-edx +1835 53/push-ebx +1836 57/push-edi +1837 # edi = out +1838 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi +1839 # ebx = n +1840 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 3/r32/ebx 0xc/disp8 . # copy *(ebp+12) to ebx +1841 # edx = width +1842 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0x10/disp8 . # copy *(ebp+16) to edx +1843 # var curr/ecx = 0 +1844 31/xor 3/mod/direct 1/rm32/ecx . . . 1/r32/ecx . . # clear ecx 1845 $emit-hex:loop: 1846 # if (curr >= width) break -1847 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX +1847 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . . # compare ecx with edx 1848 7d/jump-if-greater-or-equal $emit-hex:end/disp8 -1849 # print-byte-buffered(out, EBX) +1849 # print-byte-buffered(out, ebx) 1850 # . . push args -1851 53/push-EBX -1852 57/push-EDI +1851 53/push-ebx +1852 57/push-edi 1853 # . . call 1854 e8/call print-byte-buffered/disp32 1855 # . . discard args -1856 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +1856 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 1857 # write-byte-buffered(out, ' ') 1858 # . . push args 1859 68/push 0x20/imm32/space -1860 57/push-EDI +1860 57/push-edi 1861 # . . call 1862 e8/call write-byte-buffered/disp32 1863 # . . discard args -1864 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -1865 # EBX = EBX >> 8 -1866 c1/shift 5/subop/logic-right 3/mod/direct 3/rm32/EBX . . . . . 8/imm8 # shift EBX right by 8 bits, while padding zeroes +1864 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +1865 # ebx = ebx >> 8 +1866 c1/shift 5/subop/logic-right 3/mod/direct 3/rm32/ebx . . . . . 8/imm8 # shift ebx right by 8 bits, while padding zeroes 1867 $emit-hex:continue: 1868 # ++curr -1869 41/increment-ECX +1869 41/increment-ecx 1870 eb/jump $emit-hex:loop/disp8 1871 $emit-hex:end: 1872 # . restore registers -1873 5f/pop-to-EDI -1874 5b/pop-to-EBX -1875 5a/pop-to-EDX -1876 59/pop-to-ECX -1877 58/pop-to-EAX +1873 5f/pop-to-edi +1874 5b/pop-to-ebx +1875 5a/pop-to-edx +1876 59/pop-to-ecx +1877 58/pop-to-eax 1878 # . epilog -1879 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -1880 5d/pop-to-EBP +1879 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +1880 5d/pop-to-ebp 1881 c3/return 1882 1883 test-emit-hex-single-byte: @@ -1926,16 +1926,16 @@ if ('onhashchange' in window) { 1888 # . . call 1889 e8/call clear-stream/disp32 1890 # . . discard args -1891 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1891 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1892 # . clear-stream(_test-output-buffered-file+4) 1893 # . . push args -1894 b8/copy-to-EAX _test-output-buffered-file/imm32 -1895 05/add-to-EAX 4/imm32 -1896 50/push-EAX +1894 b8/copy-to-eax _test-output-buffered-file/imm32 +1895 05/add-to-eax 4/imm32 +1896 50/push-eax 1897 # . . call 1898 e8/call clear-stream/disp32 1899 # . . discard args -1900 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1900 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1901 # emit-hex(_test-output-buffered-file, 0xab, 1) 1902 # . . push args 1903 68/push 1/imm32 @@ -1944,25 +1944,25 @@ if ('onhashchange' in window) { 1906 # . . call 1907 e8/call emit-hex/disp32 1908 # . . discard args -1909 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1909 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1910 # flush(_test-output-buffered-file) 1911 # . . push args 1912 68/push _test-output-buffered-file/imm32 1913 # . . call 1914 e8/call flush/disp32 1915 # . . discard args -1916 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1916 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1917 # check-ints-equal(*_test-output-stream->data, 'ab ', msg) 1918 # . . push args 1919 68/push "F - test-emit-hex-single-byte"/imm32 1920 68/push 0x206261/imm32 1921 # . . push *_test-output-stream->data -1922 b8/copy-to-EAX _test-output-stream/imm32 -1923 ff 6/subop/push 1/mod/*+disp8 0/rm32/EAX . . . . 0xc/disp8 . # push *(EAX+12) +1922 b8/copy-to-eax _test-output-stream/imm32 +1923 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 0xc/disp8 . # push *(eax+12) 1924 # . . call 1925 e8/call check-ints-equal/disp32 1926 # . . discard args -1927 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1927 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1928 # . end 1929 c3/return 1930 @@ -1974,16 +1974,16 @@ if ('onhashchange' in window) { 1936 # . . call 1937 e8/call clear-stream/disp32 1938 # . . discard args -1939 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1939 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1940 # . clear-stream(_test-output-buffered-file+4) 1941 # . . push args -1942 b8/copy-to-EAX _test-output-buffered-file/imm32 -1943 05/add-to-EAX 4/imm32 -1944 50/push-EAX +1942 b8/copy-to-eax _test-output-buffered-file/imm32 +1943 05/add-to-eax 4/imm32 +1944 50/push-eax 1945 # . . call 1946 e8/call clear-stream/disp32 1947 # . . discard args -1948 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1948 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1949 # emit-hex(_test-output-buffered-file, 0x1234, 2) 1950 # . . push args 1951 68/push 2/imm32 @@ -1992,14 +1992,14 @@ if ('onhashchange' in window) { 1954 # . . call 1955 e8/call emit-hex/disp32 1956 # . . discard args -1957 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1957 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1958 # flush(_test-output-buffered-file) 1959 # . . push args 1960 68/push _test-output-buffered-file/imm32 1961 # . . call 1962 e8/call flush/disp32 1963 # . . discard args -1964 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1964 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1965 # check-stream-equal(_test-output-stream, "34 12 ", msg) 1966 # . . push args 1967 68/push "F - test-emit-hex-multiple-byte/1"/imm32 @@ -2008,7 +2008,7 @@ if ('onhashchange' in window) { 1970 # . . call 1971 e8/call check-stream-equal/disp32 1972 # . . discard args -1973 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +1973 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 1974 # . end 1975 c3/return 1976 @@ -2020,16 +2020,16 @@ if ('onhashchange' in window) { 1982 # . . call 1983 e8/call clear-stream/disp32 1984 # . . discard args -1985 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1985 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1986 # . clear-stream(_test-output-buffered-file+4) 1987 # . . push args -1988 b8/copy-to-EAX _test-output-buffered-file/imm32 -1989 05/add-to-EAX 4/imm32 -1990 50/push-EAX +1988 b8/copy-to-eax _test-output-buffered-file/imm32 +1989 05/add-to-eax 4/imm32 +1990 50/push-eax 1991 # . . call 1992 e8/call clear-stream/disp32 1993 # . . discard args -1994 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +1994 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 1995 # emit-hex(_test-output-buffered-file, 0xab, 2) 1996 # . . push args 1997 68/push 2/imm32 @@ -2038,14 +2038,14 @@ if ('onhashchange' in window) { 2000 # . . call 2001 e8/call emit-hex/disp32 2002 # . . discard args -2003 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2003 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2004 # flush(_test-output-buffered-file) 2005 # . . push args 2006 68/push _test-output-buffered-file/imm32 2007 # . . call 2008 e8/call flush/disp32 2009 # . . discard args -2010 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2010 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2011 # check(_test-output-stream->data == 'ab 00 ') 2012 # . . push args 2013 68/push "F - test-emit-hex-zero-pad/1"/imm32 @@ -2054,7 +2054,7 @@ if ('onhashchange' in window) { 2016 # . . call 2017 e8/call check-stream-equal/disp32 2018 # . . discard args -2019 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2019 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2020 # . end 2021 c3/return 2022 @@ -2066,16 +2066,16 @@ if ('onhashchange' in window) { 2028 # . . call 2029 e8/call clear-stream/disp32 2030 # . . discard args -2031 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2031 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2032 # . clear-stream(_test-output-buffered-file+4) 2033 # . . push args -2034 b8/copy-to-EAX _test-output-buffered-file/imm32 -2035 05/add-to-EAX 4/imm32 -2036 50/push-EAX +2034 b8/copy-to-eax _test-output-buffered-file/imm32 +2035 05/add-to-eax 4/imm32 +2036 50/push-eax 2037 # . . call 2038 e8/call clear-stream/disp32 2039 # . . discard args -2040 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2040 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2041 # emit-hex(_test-output-buffered-file, -1, 2) 2042 # . . push args 2043 68/push 2/imm32 @@ -2084,14 +2084,14 @@ if ('onhashchange' in window) { 2046 # . . call 2047 e8/call emit-hex/disp32 2048 # . . discard args -2049 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2049 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2050 # flush(_test-output-buffered-file) 2051 # . . push args 2052 68/push _test-output-buffered-file/imm32 2053 # . . call 2054 e8/call flush/disp32 2055 # . . discard args -2056 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2056 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2057 # check-stream-equal(_test-output-stream == "ff ff ") 2058 # . . push args 2059 68/push "F - test-emit-hex-negative/1"/imm32 @@ -2100,63 +2100,63 @@ if ('onhashchange' in window) { 2062 # . . call 2063 e8/call check-stream-equal/disp32 2064 # . . discard args -2065 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2065 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2066 # . end 2067 c3/return 2068 2069 # print 'arr' in hex with a space after every byte 2070 emit-hex-array: # out : (address buffered-file), arr : (address array byte) -> <void> 2071 # . prolog -2072 55/push-EBP -2073 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2072 55/push-ebp +2073 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2074 # . save registers -2075 50/push-EAX -2076 51/push-ECX -2077 52/push-EDX -2078 57/push-EDI -2079 # EDI = out -2080 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 8/disp8 . # copy *(EBP+8) to EDI -2081 # EDX = arr # <== 0xbdffffe4 -2082 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 2/r32/EDX 0xc/disp8 . # copy *(EBP+12) to EDX -2083 # curr/ECX = arr->data -2084 8d/copy-address 1/mod/*+disp8 2/rm32/EDX . . . 1/r32/ECX 4/disp8 . # copy EDX+4 to ECX -2085 # max/EDX = arr->data + arr->length -2086 8b/copy 0/mod/indirect 2/rm32/EDX . . . 2/r32/EDX . . # copy *EDX to EDX -2087 01/add 3/mod/direct 2/rm32/EDX . . . 1/r32/ECX . . # add ECX to EDX -2088 # EAX = 0 -2089 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX +2075 50/push-eax +2076 51/push-ecx +2077 52/push-edx +2078 57/push-edi +2079 # edi = out +2080 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi +2081 # edx = arr # <== 0xbdffffe4 +2082 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx +2083 # curr/ecx = arr->data +2084 8d/copy-address 1/mod/*+disp8 2/rm32/edx . . . 1/r32/ecx 4/disp8 . # copy edx+4 to ecx +2085 # max/edx = arr->data + arr->length +2086 8b/copy 0/mod/indirect 2/rm32/edx . . . 2/r32/edx . . # copy *edx to edx +2087 01/add 3/mod/direct 2/rm32/edx . . . 1/r32/ecx . . # add ecx to edx +2088 # eax = 0 +2089 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax 2090 $emit-hex-array:loop: 2091 # if (curr >= width) break -2092 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX +2092 39/compare 3/mod/direct 1/rm32/ecx . . . 2/r32/edx . . # compare ecx with edx 2093 73/jump-if-greater-or-equal-unsigned $emit-hex-array:end/disp8 2094 # emit-hex(out, *curr, width=1) 2095 # . . push args 2096 68/push 1/imm32/width -2097 8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy byte at *ECX to AL -2098 50/push-EAX -2099 57/push-EDI +2097 8a/copy-byte 0/mod/indirect 1/rm32/ecx . . . 0/r32/AL . . # copy byte at *ecx to AL +2098 50/push-eax +2099 57/push-edi 2100 # . . call 2101 e8/call emit-hex/disp32 2102 # . . discard args -2103 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2103 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2104 # ++curr -2105 41/increment-ECX +2105 41/increment-ecx 2106 eb/jump $emit-hex-array:loop/disp8 2107 $emit-hex-array:end: 2108 # . restore registers -2109 5f/pop-to-EDI -2110 5a/pop-to-EDX -2111 59/pop-to-ECX -2112 58/pop-to-EAX +2109 5f/pop-to-edi +2110 5a/pop-to-edx +2111 59/pop-to-ecx +2112 58/pop-to-eax 2113 # . epilog -2114 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2115 5d/pop-to-EBP +2114 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2115 5d/pop-to-ebp 2116 c3/return 2117 2118 test-emit-hex-array: 2119 # . prolog -2120 55/push-EBP -2121 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2120 55/push-ebp +2121 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2122 # setup 2123 # . clear-stream(_test-output-stream) 2124 # . . push args @@ -2164,35 +2164,35 @@ if ('onhashchange' in window) { 2126 # . . call 2127 e8/call clear-stream/disp32 2128 # . . discard args -2129 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2129 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2130 # . clear-stream(_test-output-buffered-file+4) 2131 # . . push args -2132 b8/copy-to-EAX _test-output-buffered-file/imm32 -2133 05/add-to-EAX 4/imm32 -2134 50/push-EAX +2132 b8/copy-to-eax _test-output-buffered-file/imm32 +2133 05/add-to-eax 4/imm32 +2134 50/push-eax 2135 # . . call 2136 e8/call clear-stream/disp32 2137 # . . discard args -2138 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2139 # var arr/ECX (address array byte) = [01, 02, 03] +2138 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2139 # var arr/ecx (address array byte) = [01, 02, 03] 2140 68/push 0x00030201/imm32 # bytes 01 02 03 2141 68/push 3/imm32/length -2142 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +2142 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx 2143 # emit-hex-array(_test-output-buffered-file, arr) 2144 # . . push args -2145 51/push-ECX +2145 51/push-ecx 2146 68/push _test-output-buffered-file/imm32 2147 # . . call 2148 e8/call emit-hex-array/disp32 2149 # . . discard args -2150 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +2150 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 2151 # . flush(_test-output-buffered-file) 2152 # . . push args 2153 68/push _test-output-buffered-file/imm32 2154 # . . call 2155 e8/call flush/disp32 2156 # . . discard args -2157 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2157 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2158 +-- 33 lines: #? # dump output --------------------------------------------------------------------------------------------------------------------------- 2191 # check-next-stream-line-equal(_test-output-stream, "01 02 03 ", msg) 2192 # . . push args @@ -2202,331 +2202,331 @@ if ('onhashchange' in window) { 2196 # . . call 2197 e8/call check-next-stream-line-equal/disp32 2198 # . . discard args -2199 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2199 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2200 # . epilog -2201 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2202 5d/pop-to-EBP +2201 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2202 5d/pop-to-ebp 2203 c3/return 2204 -2205 compute-width: # word : (address array byte) -> EAX : int +2205 compute-width: # word : (address array byte) -> eax : int 2206 # . prolog -2207 55/push-EBP -2208 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2207 55/push-ebp +2208 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2209 # . save registers -2210 51/push-ECX -2211 # EAX = word -2212 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to ECX -2213 # ECX = word + word->length -2214 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -2215 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -2216 # EAX = word->data -2217 05/add-to-EAX 4/imm32 -2218 # var in/ECX : (address slice) = {EAX, ECX} -2219 51/push-ECX -2220 50/push-EAX -2221 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -2222 # return compute-width-of-slice(ECX) +2210 51/push-ecx +2211 # eax = word +2212 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 0/r32/eax 8/disp8 . # copy *(ebp+8) to ecx +2213 # ecx = word + word->length +2214 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +2215 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +2216 # eax = word->data +2217 05/add-to-eax 4/imm32 +2218 # var in/ecx : (address slice) = {eax, ecx} +2219 51/push-ecx +2220 50/push-eax +2221 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +2222 # return compute-width-of-slice(ecx) 2223 # . . push args -2224 51/push-ECX +2224 51/push-ecx 2225 # . . call 2226 e8/call compute-width-of-slice/disp32 2227 # . . discard args -2228 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +2228 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 2229 $compute-width:end: 2230 # . reclaim locals -2231 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +2231 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp 2232 # . restore registers -2233 59/pop-to-ECX +2233 59/pop-to-ecx 2234 # . epilog -2235 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2236 5d/pop-to-EBP +2235 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2236 5d/pop-to-ebp 2237 c3/return 2238 -2239 compute-width-of-slice: # s : (address slice) -> EAX : int +2239 compute-width-of-slice: # s : (address slice) -> eax : int 2240 # . prolog -2241 55/push-EBP -2242 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2241 55/push-ebp +2242 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2243 # . save registers -2244 51/push-ECX -2245 # ECX = s -2246 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX +2244 51/push-ecx +2245 # ecx = s +2246 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 8/disp8 . # copy *(ebp+8) to ecx 2247 # if (has-metadata?(word, "imm32")) return 4 -2248 # . EAX = has-metadata?(word, "imm32") +2248 # . eax = has-metadata?(word, "imm32") 2249 # . . push args 2250 68/push "imm32"/imm32 -2251 51/push-ECX +2251 51/push-ecx 2252 # . . call 2253 e8/call has-metadata?/disp32 2254 # . . discard args -2255 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -2256 # . if (EAX != 0) return 4 -2257 3d/compare-EAX-and 0/imm32 -2258 b8/copy-to-EAX 4/imm32 # ZF is set, so we can overwrite EAX now +2255 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +2256 # . if (eax != 0) return 4 +2257 3d/compare-eax-and 0/imm32 +2258 b8/copy-to-eax 4/imm32 # ZF is set, so we can overwrite eax now 2259 75/jump-if-not-equal $compute-width-of-slice:end/disp8 2260 # if (has-metadata?(word, "disp32")) return 4 -2261 # . EAX = has-metadata?(word, "disp32") +2261 # . eax = has-metadata?(word, "disp32") 2262 # . . push args 2263 68/push "disp32"/imm32 -2264 51/push-ECX +2264 51/push-ecx 2265 # . . call 2266 e8/call has-metadata?/disp32 2267 # . . discard args -2268 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -2269 # . if (EAX != 0) return 4 -2270 3d/compare-EAX-and 0/imm32 -2271 b8/copy-to-EAX 4/imm32 # ZF is set, so we can overwrite EAX now +2268 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +2269 # . if (eax != 0) return 4 +2270 3d/compare-eax-and 0/imm32 +2271 b8/copy-to-eax 4/imm32 # ZF is set, so we can overwrite eax now 2272 75/jump-if-not-equal $compute-width-of-slice:end/disp8 2273 # if (has-metadata?(word, "imm16")) return 2 -2274 # . EAX = has-metadata?(word, "imm16") +2274 # . eax = has-metadata?(word, "imm16") 2275 # . . push args 2276 68/push "imm16"/imm32 -2277 51/push-ECX +2277 51/push-ecx 2278 # . . call 2279 e8/call has-metadata?/disp32 2280 # . . discard args -2281 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -2282 # . if (EAX != 0) return 2 -2283 3d/compare-EAX-and 0/imm32 -2284 b8/copy-to-EAX 2/imm32 # ZF is set, so we can overwrite EAX now +2281 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +2282 # . if (eax != 0) return 2 +2283 3d/compare-eax-and 0/imm32 +2284 b8/copy-to-eax 2/imm32 # ZF is set, so we can overwrite eax now 2285 75/jump-if-not-equal $compute-width-of-slice:end/disp8 2286 # if (has-metadata?(word, "disp16")) return 2 -2287 # . EAX = has-metadata?(word, "disp16") +2287 # . eax = has-metadata?(word, "disp16") 2288 # . . push args 2289 68/push "disp16"/imm32 -2290 51/push-ECX +2290 51/push-ecx 2291 # . . call 2292 e8/call has-metadata?/disp32 2293 # . . discard args -2294 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -2295 # . if (EAX != 0) return 2 -2296 3d/compare-EAX-and 0/imm32 -2297 b8/copy-to-EAX 2/imm32 # ZF is set, so we can overwrite EAX now +2294 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp +2295 # . if (eax != 0) return 2 +2296 3d/compare-eax-and 0/imm32 +2297 b8/copy-to-eax 2/imm32 # ZF is set, so we can overwrite eax now 2298 75/jump-if-not-equal $compute-width-of-slice:end/disp8 2299 # otherwise return 1 -2300 b8/copy-to-EAX 1/imm32 +2300 b8/copy-to-eax 1/imm32 2301 $compute-width-of-slice:end: 2302 # . restore registers -2303 59/pop-to-ECX +2303 59/pop-to-ecx 2304 # . epilog -2305 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2306 5d/pop-to-EBP +2305 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2306 5d/pop-to-ebp 2307 c3/return 2308 2309 test-compute-width: 2310 # . prolog -2311 55/push-EBP -2312 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2311 55/push-ebp +2312 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2313 $test-compute-width:imm8: -2314 # EAX = compute-width("0x2/imm8") +2314 # eax = compute-width("0x2/imm8") 2315 # . . push args 2316 68/push "0x2/imm8"/imm32 2317 # . . call 2318 e8/call compute-width/disp32 2319 # . . discard args -2320 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2321 # check-ints-equal(EAX, 1, msg) +2320 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2321 # check-ints-equal(eax, 1, msg) 2322 # . . push args 2323 68/push "F - test-compute-width: 0x2/imm8"/imm32 -2324 50/push-EAX +2324 50/push-eax 2325 68/push 1/imm32 2326 # . . call 2327 e8/call check-ints-equal/disp32 2328 # . . discard args -2329 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2329 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2330 $test-compute-width:imm16: -2331 # EAX = compute-width("4/imm16") +2331 # eax = compute-width("4/imm16") 2332 # . . push args 2333 68/push "4/imm16"/imm32 2334 # . . call 2335 e8/call compute-width/disp32 2336 # . . discard args -2337 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2338 # check-ints-equal(EAX, 2, msg) +2337 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2338 # check-ints-equal(eax, 2, msg) 2339 # . . push args 2340 68/push "F - test-compute-width: 4/imm16"/imm32 -2341 50/push-EAX +2341 50/push-eax 2342 68/push 2/imm32 2343 # . . call 2344 e8/call check-ints-equal/disp32 2345 # . . discard args -2346 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2346 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2347 $test-compute-width:imm32: -2348 # EAX = compute-width("4/imm32") +2348 # eax = compute-width("4/imm32") 2349 # . . push args 2350 68/push "4/imm32"/imm32 2351 # . . call 2352 e8/call compute-width/disp32 2353 # . . discard args -2354 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2355 # check-ints-equal(EAX, 4, msg) +2354 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2355 # check-ints-equal(eax, 4, msg) 2356 # . . push args 2357 68/push "F - test-compute-width: 4/imm32"/imm32 -2358 50/push-EAX +2358 50/push-eax 2359 68/push 4/imm32 2360 # . . call 2361 e8/call check-ints-equal/disp32 2362 # . . discard args -2363 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2363 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2364 $test-compute-width:disp8: -2365 # EAX = compute-width("foo/disp8") +2365 # eax = compute-width("foo/disp8") 2366 # . . push args 2367 68/push "foo/disp8"/imm32 2368 # . . call 2369 e8/call compute-width/disp32 2370 # . . discard args -2371 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2372 # check-ints-equal(EAX, 1, msg) +2371 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2372 # check-ints-equal(eax, 1, msg) 2373 # . . push args 2374 68/push "F - test-compute-width: foo/disp8"/imm32 -2375 50/push-EAX +2375 50/push-eax 2376 68/push 1/imm32 2377 # . . call 2378 e8/call check-ints-equal/disp32 2379 # . . discard args -2380 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2380 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2381 $test-compute-width:disp16: -2382 # EAX = compute-width("foo/disp16") +2382 # eax = compute-width("foo/disp16") 2383 # . . push args 2384 68/push "foo/disp16"/imm32 2385 # . . call 2386 e8/call compute-width/disp32 2387 # . . discard args -2388 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2389 # check-ints-equal(EAX, 2, msg) +2388 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2389 # check-ints-equal(eax, 2, msg) 2390 # . . push args 2391 68/push "F - test-compute-width: foo/disp16"/imm32 -2392 50/push-EAX +2392 50/push-eax 2393 68/push 2/imm32 2394 # . . call 2395 e8/call check-ints-equal/disp32 2396 # . . discard args -2397 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2397 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2398 $test-compute-width:disp32: -2399 # EAX = compute-width("foo/disp32") +2399 # eax = compute-width("foo/disp32") 2400 # . . push args 2401 68/push "foo/disp32"/imm32 2402 # . . call 2403 e8/call compute-width/disp32 2404 # . . discard args -2405 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2406 # check-ints-equal(EAX, 4, msg) +2405 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2406 # check-ints-equal(eax, 4, msg) 2407 # . . push args 2408 68/push "F - test-compute-width: foo/disp32"/imm32 -2409 50/push-EAX +2409 50/push-eax 2410 68/push 4/imm32 2411 # . . call 2412 e8/call check-ints-equal/disp32 2413 # . . discard args -2414 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2414 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2415 $test-compute-width:no-metadata: -2416 # EAX = compute-width("45") +2416 # eax = compute-width("45") 2417 # . . push args 2418 68/push "45"/imm32 2419 # . . call 2420 e8/call compute-width/disp32 2421 # . . discard args -2422 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2423 # check-ints-equal(EAX, 1, msg) +2422 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2423 # check-ints-equal(eax, 1, msg) 2424 # . . push args 2425 68/push "F - test-compute-width: 45 (no metadata)"/imm32 -2426 50/push-EAX +2426 50/push-eax 2427 68/push 1/imm32 2428 # . . call 2429 e8/call check-ints-equal/disp32 2430 # . . discard args -2431 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2431 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2432 # . epilog -2433 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2434 5d/pop-to-EBP +2433 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2434 5d/pop-to-ebp 2435 c3/return 2436 -2437 is-label?: # word : (address slice) -> EAX : boolean +2437 is-label?: # word : (address slice) -> eax : boolean 2438 # . prolog -2439 55/push-EBP -2440 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2439 55/push-ebp +2440 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2441 # . save registers -2442 51/push-ECX -2443 # ECX = word -2444 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX -2445 # ECX = word->end -2446 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 1/r32/ECX 4/disp8 . # copy *(ECX+4) to ECX +2442 51/push-ecx +2443 # ecx = word +2444 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 8/disp8 . # copy *(ebp+8) to ecx +2445 # ecx = word->end +2446 8b/copy 1/mod/*+disp8 1/rm32/ecx . . . 1/r32/ecx 4/disp8 . # copy *(ecx+4) to ecx 2447 # return *(word->end - 1) == ':' -2448 # . EAX = 0 -2449 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX -2450 # . EAX = *((char *) word->end - 1) -2451 8a/copy-byte 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/AL -1/disp8 . # copy byte at *(ECX-1) to AL -2452 # . return (EAX == ':') -2453 3d/compare-EAX-and 0x3a/imm32/colon -2454 b8/copy-to-EAX 1/imm32/true +2448 # . eax = 0 +2449 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax +2450 # . eax = *((char *) word->end - 1) +2451 8a/copy-byte 1/mod/*+disp8 1/rm32/ecx . . . 0/r32/AL -1/disp8 . # copy byte at *(ecx-1) to AL +2452 # . return (eax == ':') +2453 3d/compare-eax-and 0x3a/imm32/colon +2454 b8/copy-to-eax 1/imm32/true 2455 74/jump-if-equal $is-label?:end/disp8 -2456 b8/copy-to-EAX 0/imm32/false +2456 b8/copy-to-eax 0/imm32/false 2457 $is-label?:end: 2458 # . restore registers -2459 59/pop-to-ECX +2459 59/pop-to-ecx 2460 # . epilog -2461 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2462 5d/pop-to-EBP +2461 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2462 5d/pop-to-ebp 2463 c3/return 2464 2465 test-is-label?: 2466 # . prolog -2467 55/push-EBP -2468 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +2467 55/push-ebp +2468 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp 2469 $test-is-label?:true: -2470 # (EAX..ECX) = "AAA:" -2471 b8/copy-to-EAX "AAA:"/imm32 -2472 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -2473 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -2474 05/add-to-EAX 4/imm32 -2475 # var slice/ECX = {EAX, ECX} -2476 51/push-ECX -2477 50/push-EAX -2478 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -2479 # is-label?(slice/ECX) +2470 # (eax..ecx) = "AAA:" +2471 b8/copy-to-eax "AAA:"/imm32 +2472 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +2473 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +2474 05/add-to-eax 4/imm32 +2475 # var slice/ecx = {eax, ecx} +2476 51/push-ecx +2477 50/push-eax +2478 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +2479 # is-label?(slice/ecx) 2480 # . . push args -2481 51/push-ECX +2481 51/push-ecx 2482 # . . call 2483 e8/call is-label?/disp32 2484 # . . discard args -2485 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2486 # check-ints-equal(EAX, 1, msg) +2485 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2486 # check-ints-equal(eax, 1, msg) 2487 # . . push args 2488 68/push "F - test-is-label?:true"/imm32 2489 68/push 1/imm32 -2490 50/push-EAX +2490 50/push-eax 2491 # . . call 2492 e8/call check-ints-equal/disp32 2493 # . . discard args -2494 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2494 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2495 $test-is-label?:false: -2496 # (EAX..ECX) = "AAA" -2497 b8/copy-to-EAX "AAA"/imm32 -2498 8b/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy *EAX to ECX -2499 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/EAX 1/index/ECX . 1/r32/ECX 4/disp8 . # copy EAX+ECX+4 to ECX -2500 05/add-to-EAX 4/imm32 -2501 # var slice/ECX = {EAX, ECX} -2502 51/push-ECX -2503 50/push-EAX -2504 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -2505 # is-label?(slice/ECX) +2496 # (eax..ecx) = "AAA" +2497 b8/copy-to-eax "AAA"/imm32 +2498 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx +2499 8d/copy-address 1/mod/*+disp8 4/rm32/sib 0/base/eax 1/index/ecx . 1/r32/ecx 4/disp8 . # copy eax+ecx+4 to ecx +2500 05/add-to-eax 4/imm32 +2501 # var slice/ecx = {eax, ecx} +2502 51/push-ecx +2503 50/push-eax +2504 89/copy 3/mod/direct 1/rm32/ecx . . . 4/r32/esp . . # copy esp to ecx +2505 # is-label?(slice/ecx) 2506 # . . push args -2507 51/push-ECX +2507 51/push-ecx 2508 # . . call 2509 e8/call is-label?/disp32 2510 # . . discard args -2511 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -2512 # check-ints-equal(EAX, 0, msg) +2511 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp +2512 # check-ints-equal(eax, 0, msg) 2513 # . . push args 2514 68/push "F - test-is-label?:false"/imm32 2515 68/push 0/imm32 -2516 50/push-EAX +2516 50/push-eax 2517 # . . call 2518 e8/call check-ints-equal/disp32 2519 # . . discard args -2520 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +2520 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp 2521 # . epilog -2522 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -2523 5d/pop-to-EBP +2522 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +2523 5d/pop-to-ebp 2524 c3/return 2525 2526 == data -- cgit 1.4.1-2-gfad0