From 056d31efa737a2ea8ba7ec79a061cd43f7a07661 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Tue, 2 Apr 2019 07:08:23 -0700 Subject: [PATCH] 5049 --- subx/apps/pack.subx | 296 +++++++++++++++++++++++++++++--------------- 1 file changed, 196 insertions(+), 100 deletions(-) diff --git a/subx/apps/pack.subx b/subx/apps/pack.subx index 11643f42..8aa09bd9 100644 --- a/subx/apps/pack.subx +++ b/subx/apps/pack.subx @@ -155,7 +155,7 @@ $convert:check0: # if (line->write == 0) break 81 7/subop/compare 0/mod/indirect 1/rm32/ECX . . . . . 0/imm32 # compare *ECX 0f 84/jump-if-equal $convert:break/disp32 -#? # dump current line {{{ +#? # dump line {{{ #? # . write(2/stderr, "LL: ") #? # . . push args #? 68/push "LL: "/imm32 @@ -188,7 +188,7 @@ $convert:check0: #? e8/call write/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -#? }}} +#? # }}} # next-word(line, word-slice) # . . push args 52/push-EDX @@ -210,7 +210,7 @@ $convert:check1: 3d/compare-EAX-and 0/imm32 0f 85/jump-if-not-equal $convert:pass-through/disp32 $convert:check2: -#? # dump current word {{{ +#? # dump word-slice {{{ #? # . write(2/stderr, "AA: ") #? # . . push args #? 68/push "AA: "/imm32 @@ -1066,28 +1066,36 @@ convert-data: # line : (address stream byte), out : (address buffered-file) -> 68/push 0/imm32/start 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX #? # dump line {{{ -#? # write-buffered(Stderr, "LL: ") +#? # . write(2/stderr, "LL: ") #? # . . push args #? 68/push "LL: "/imm32 -#? 68/push Stderr/imm32 +#? 68/push 2/imm32/stderr #? # . . call -#? e8/call write-buffered/disp32 +#? e8/call write/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -#? # write-stream-buffered(Stderr, line) +#? # write-stream(2/stderr, line) #? # . . push args #? ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) -#? 68/push Stderr/imm32 +#? 68/push 2/imm32/stderr #? # . . call -#? e8/call write-stream-buffered/disp32 +#? e8/call write-stream/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -#? # write-buffered(Stderr, "\n") +#? # . write(2/stderr, "$") +#? # . . push args +#? 68/push "$"/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # . write(2/stderr, "\n") #? # . . push args #? 68/push Newline/imm32 -#? 68/push Stderr/imm32 +#? 68/push 2/imm32/stderr #? # . . call -#? e8/call write-buffered/disp32 +#? e8/call write/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP #? # }}} @@ -1101,15 +1109,24 @@ $convert-data:loop: # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP #? # dump word-slice {{{ -#? # write-buffered(Stderr, "AA: ") +#? # . write(2/stderr, "AA: ") #? # . . push args #? 68/push "AA: "/imm32 -#? 68/push Stderr/imm32 +#? 68/push 2/imm32/stderr #? # . . call -#? e8/call write-buffered/disp32 +#? e8/call write/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -#? # write-slice(Stderr, word-slice) +#? # . clear-stream(Stderr+4) +#? # . . push args +#? b8/copy-to-EAX Stderr/imm32 +#? 05/add-to-EAX 4/imm32 +#? 50/push-EAX +#? # . . call +#? e8/call clear-stream/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +#? # . write-slice(Stderr, word-slice) #? # . . push args #? 51/push-ECX #? 68/push Stderr/imm32 @@ -1117,12 +1134,27 @@ $convert-data:loop: #? e8/call write-slice/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -#? # write-buffered(Stderr, "\n") +#? # . flush(Stderr) #? # . . push args -#? 68/push Newline/imm32 #? 68/push Stderr/imm32 #? # . . call -#? e8/call write-buffered/disp32 +#? e8/call flush/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +#? # . write(2/stderr, "$") +#? # . . push args +#? 68/push "$"/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 +#? # . . discard args +#? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +#? # . write(2/stderr, "\n") +#? # . . push args +#? 68/push Newline/imm32 +#? 68/push 2/imm32/stderr +#? # . . call +#? e8/call write/disp32 #? # . . discard args #? 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP #? # }}} @@ -2322,22 +2354,22 @@ $emit-sib:end: emit-disp: # line : (address stream byte), out : (address buffered-file) -> # pseudocode: # rewind-stream(line) - # var slice = {0, 0} + # var word-slice = {0, 0} # var disp = 0 # while true - # slice = next-word(line) - # if (slice-empty?(slice)) break - # if (slice-starts-with?(slice, "#")) break - # if has-metadata?(slice, "disp32") - # disp = parse-hex-int(next-token-from-slice(slice, "/")) + # word-slice = next-word(line) + # if (slice-empty?(word-slice)) break + # if (slice-starts-with?(word-slice, "#")) break + # if has-metadata?(word-slice, "disp32") + # disp = parse-hex-int(next-token-from-slice(word-slice, "/")) # emit-hex(out, disp, 4) # break - # if has-metadata?(slice, "disp16") - # disp = parse-hex-int(next-token-from-slice(slice, "/")) + # if has-metadata?(word-slice, "disp16") + # disp = parse-hex-int(next-token-from-slice(word-slice, "/")) # emit-hex(out, disp, 2) # break - # if has-metadata?(slice, "disp8") - # disp = parse-hex-int(next-token-from-slice(slice, "/")) + # if has-metadata?(word-slice, "disp8") + # disp = parse-hex-int(next-token-from-slice(word-slice, "/")) # emit-hex(out, disp, 1) # break # @@ -2349,7 +2381,7 @@ emit-disp: # line : (address stream byte), out : (address buffered-file) -> start + # if (slice-starts-with?(word-slice, "#")) break + # . start/EDX = word-slice->start 8b/copy 0/mod/indirect 1/rm32/ECX . . . 2/r32/EDX . . # copy *ECX to EDX # . c/EAX = *start 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX @@ -2445,7 +2509,7 @@ $emit-disp:check1: 3d/compare-EAX-and 0x23/imm32/hash 0f 84/jump-if-equal $emit-disp:break/disp32 $emit-disp:check-for-disp32: - # if (has-metadata?(slice, "disp32")) + # if (has-metadata?(word-slice, "disp32")) # . EAX = has-metadata?(ECX, "disp32") # . . push args 68/push "disp32"/imm32 @@ -2458,8 +2522,8 @@ $emit-disp:check-for-disp32: 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0/imm32 # compare EAX 74/jump-if-equal $emit-disp:check-for-disp16/disp8 $emit-disp:disp32: - # disp = parse-hex-int(next-token-from-slice(slice->start, slice->end, '/')) - # . EAX = parse-datum-of-word(slice) + # disp = parse-hex-int(next-token-from-slice(word-slice->start, word-slice->end, '/')) + # . EAX = parse-datum-of-word(word-slice) # . . push args 51/push-ECX # . . call @@ -2480,7 +2544,7 @@ $emit-disp:disp32: # break e9/jump $emit-disp:break/disp32 $emit-disp:check-for-disp16: - # else if (has-metadata?(slice, "disp16")) + # else if (has-metadata?(word-slice, "disp16")) # . EAX = has-metadata?(ECX, "disp16") # . . push args 68/push "disp16"/imm32 @@ -2493,8 +2557,8 @@ $emit-disp:check-for-disp16: 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0/imm32 # compare EAX 74/jump-if-equal $emit-disp:check-for-disp8/disp8 $emit-disp:disp16: - # disp = parse-hex-int(next-token-from-slice(slice->start, slice->end, '/')) - # . EAX = parse-datum-of-word(slice) + # disp = parse-hex-int(next-token-from-slice(word-slice->start, word-slice->end, '/')) + # . EAX = parse-datum-of-word(word-slice) # . . push args 51/push-ECX # . . call @@ -2515,7 +2579,7 @@ $emit-disp:disp16: # break e9/jump $emit-disp:break/disp32 $emit-disp:check-for-disp8: - # if (has-metadata?(slice, "disp8")) + # if (has-metadata?(word-slice, "disp8")) # . EAX = has-metadata?(ECX, "disp8") # . . push args 68/push "disp8"/imm32 @@ -2528,8 +2592,8 @@ $emit-disp:check-for-disp8: 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0/imm32 # compare EAX 0f 84/jump-if-equal $emit-disp:loop/disp32 $emit-disp:disp8: - # slice = parse-hex-int(next-token-from-slice(slice->start, slice->end, '/')) - # . EAX = parse-datum-of-word(slice) + # disp = parse-hex-int(next-token-from-slice(word-slice->start, word-slice->end, '/')) + # . EAX = parse-datum-of-word(word-slice) # . . push args 51/push-ECX # . . call @@ -2564,22 +2628,22 @@ $emit-disp:break: emit-imm: # line : (address stream byte), out : (address buffered-file) -> # pseudocode: # rewind-stream(line) - # var slice = {0, 0} + # var word-slice = {0, 0} # var imm = 0 # while true - # slice = next-word(line) - # if (slice-empty?(slice)) break - # if (slice-starts-with?(slice, "#")) break - # if has-metadata?(slice, "imm32") - # imm = parse-hex-int(next-token-from-slice(slice, "/")) + # word-slice = next-word(line) + # if (slice-empty?(word-slice)) break + # if (slice-starts-with?(word-slice, "#")) break + # if has-metadata?(word-slice, "imm32") + # imm = parse-hex-int(next-token-from-slice(word-slice, "/")) # emit-hex(out, imm, 4) # break - # if has-metadata?(slice, "imm16") - # imm = parse-hex-int(next-token-from-slice(slice, "/")) + # if has-metadata?(word-slice, "imm16") + # imm = parse-hex-int(next-token-from-slice(word-slice, "/")) # emit-hex(out, imm, 2) # break - # if has-metadata?(slice, "imm8") - # imm = parse-hex-int(next-token-from-slice(slice, "/")) + # if has-metadata?(word-slice, "imm8") + # imm = parse-hex-int(next-token-from-slice(word-slice, "/")) # emit-hex(out, imm, 1) # break # @@ -2591,7 +2655,7 @@ emit-imm: # line : (address stream byte), out : (address buffered-file) -> start 8b/copy 0/mod/indirect 1/rm32/ECX . . . 2/r32/EDX . . # copy *ECX to EDX # . c/EAX = *start @@ -2687,7 +2783,7 @@ $emit-imm:check1: 3d/compare-EAX-and 0x23/imm32/hash 0f 84/jump-if-equal $emit-imm:break/disp32 $emit-imm:check-for-imm32: - # if (has-metadata?(slice, "imm32")) + # if (has-metadata?(word-slice, "imm32")) # . EAX = has-metadata?(ECX, "imm32") # . . push args 68/push "imm32"/imm32 @@ -2701,7 +2797,7 @@ $emit-imm:check-for-imm32: 74/jump-if-equal $emit-imm:check-for-imm16/disp8 $emit-imm:imm32: # imm = parse-hex-int(next-token-from-slice(slice->start, slice->end, '/')) - # . EAX = parse-datum-of-word(slice) + # . EAX = parse-datum-of-word(word-slice) # . . push args 51/push-ECX # . . call @@ -2722,7 +2818,7 @@ $emit-imm:imm32: # break e9/jump $emit-imm:break/disp32 $emit-imm:check-for-imm16: - # if (has-metadata?(slice, "imm16")) + # if (has-metadata?(word-slice, "imm16")) # . EAX = has-metadata?(ECX, "imm16") # . . push args 68/push "imm16"/imm32 @@ -2736,7 +2832,7 @@ $emit-imm:check-for-imm16: 74/jump-if-equal $emit-imm:check-for-imm8/disp8 $emit-imm:imm16: # imm = parse-hex-int(next-token-from-slice(slice->start, slice->end, '/')) - # . EAX = parse-datum-of-word(slice) + # . EAX = parse-datum-of-word(word-slice) # . . push args 51/push-ECX # . . call @@ -2757,7 +2853,7 @@ $emit-imm:imm16: # break e9/jump $emit-imm:break/disp32 $emit-imm:check-for-imm8: - # if (has-metadata?(slice, "imm8")) + # if (has-metadata?(word-slice, "imm8")) # . EAX = has-metadata?(ECX, "imm8") # . . push args 68/push "imm8"/imm32 @@ -2770,8 +2866,8 @@ $emit-imm:check-for-imm8: 81 7/subop/compare 3/mod/direct 0/rm32/EAX . . . . . 0/imm32 # compare EAX 0f 84/jump-if-equal $emit-imm:loop/disp32 $emit-imm:imm8: - # slice = parse-hex-int(next-token-from-slice(slice->start, slice->end, '/')) - # . EAX = parse-datum-of-word(slice) + # word-slice = parse-hex-int(next-token-from-slice(word-slice->start, word-slice->end, '/')) + # . EAX = parse-datum-of-word(word-slice) # . . push args 51/push-ECX # . . call