From 0d219f0a732d81dad124906f5594a06b023fa3a0 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sun, 21 Jul 2019 22:34:15 -0700 Subject: 5438 - raise error on uppercase hex We can now translate layers 49-56 using the self-hosted translator (`translate` and `ntranslate`). As a follow-up to commit 5404, the self-hosted translator is a little more strict than the C++ translator in 3 places: a) All .subx files must define a data segment. b) All .subx files must define an `Entry` label. c) All numbers must be in *lowercase* hex. In all cases, where programs work with the C++ translator but violate the self-hosted translator's assumptions, we must make sure we raise errors rather than silently emit bad code. --- subx/056trace.subx | 4 +-- subx/067parse-hex.subx | 75 +++++++++++++++++++++++++++++++++++++++++++++---- subx/apps/assort | Bin 34167 -> 34326 bytes subx/apps/crenshaw2-1 | Bin 24575 -> 24734 bytes subx/apps/crenshaw2-1b | Bin 25134 -> 25293 bytes subx/apps/dquotes | Bin 40723 -> 40882 bytes subx/apps/factorial | Bin 23491 -> 23650 bytes subx/apps/handle | Bin 24350 -> 24509 bytes subx/apps/hex | Bin 27584 -> 27743 bytes subx/apps/pack | Bin 46819 -> 46978 bytes subx/apps/survey | Bin 42817 -> 42976 bytes subx/apps/tests | Bin 32979 -> 33138 bytes 12 files changed, 72 insertions(+), 7 deletions(-) (limited to 'subx') diff --git a/subx/056trace.subx b/subx/056trace.subx index cc245e3f..c1105b15 100644 --- a/subx/056trace.subx +++ b/subx/056trace.subx @@ -984,7 +984,7 @@ _test-stream-line-ABABA: # length 8/imm32 # data - 41 42 41 42 41 0A 00 00 # 8 bytes + 41 42 41 42 41 0a 00 00 # 8 bytes _test-stream-empty: # write @@ -1004,6 +1004,6 @@ _test-stream-filled: # length 8/imm32 # data - 41 41 41 41 0A 41 41 41 # 8 bytes + 41 41 41 41 0a 41 41 41 # 8 bytes # . . vim:nowrap:textwidth=0 diff --git a/subx/067parse-hex.subx b/subx/067parse-hex.subx index bbfc4ec9..45d168d9 100644 --- a/subx/067parse-hex.subx +++ b/subx/067parse-hex.subx @@ -795,15 +795,80 @@ test-hex-above-f: c3/return from-hex-char: # in/EAX : byte -> out/EAX : nibble - # no error checking; accepts argument in EAX - # if (EAX <= '9') return EAX - '0' +$from-hex-char:check0: + # if (EAX < '0') goto abort + 3d/compare-EAX-with 0x30/imm32/0 + 7c/jump-if-lesser $from-hex-char:abort/disp8 +$from-hex-char:check1: + # if (EAX > 'f') goto abort + 3d/compare-EAX-with 0x66/imm32/f + 7f/jump-if-greater $from-hex-char:abort/disp8 +$from-hex-char:check2: + # if (EAX > '9') goto next check 3d/compare-EAX-with 0x39/imm32/9 - 7f/jump-if-greater $from-hex-char:else/disp8 + 7f/jump-if-greater $from-hex-char:check3/disp8 +$from-hex-char:digit: + # return EAX - '0' 2d/subtract-from-EAX 0x30/imm32/0 c3/return -$from-hex-char:else: - # otherwise return EAX - 'a' + 10 +$from-hex-char:check3: + # if (EAX < 'a') goto abort + 3d/compare-EAX-with 0x61/imm32/a + 7c/jump-if-lesser $from-hex-char:abort/disp8 +$from-hex-char:letter: + # return EAX - ('a'-10) 2d/subtract-from-EAX 0x57/imm32/a-10 c3/return +$from-hex-char:abort: + # . _write(2/stderr, error) + # . . push args + 68/push "invalid hex char: "/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 + # . clear-stream(Stderr+4) + # . . save EAX + 50/push-EAX + # . . 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 + # . . restore EAX + 58/pop-to-EAX + # . print-int32-buffered(Stderr, EAX) + # . . push args + 50/push-EAX + 68/push Stderr/imm32 + # . . call + e8/call print-int32-buffered/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # . flush(Stderr) + # . . push args + 68/push Stderr/imm32 + # . . call + e8/call flush/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + # . _write(2/stderr, "\n") + # . . push args + 68/push "\n"/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 + # . syscall(exit, 1) + bb/copy-to-EBX 1/imm32 + b8/copy-to-EAX 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + # . . vim:nowrap:textwidth=0 diff --git a/subx/apps/assort b/subx/apps/assort index d096be37..61aadb87 100755 Binary files a/subx/apps/assort and b/subx/apps/assort differ diff --git a/subx/apps/crenshaw2-1 b/subx/apps/crenshaw2-1 index db50d1cf..d4593a77 100755 Binary files a/subx/apps/crenshaw2-1 and b/subx/apps/crenshaw2-1 differ diff --git a/subx/apps/crenshaw2-1b b/subx/apps/crenshaw2-1b index 4e05331b..51919217 100755 Binary files a/subx/apps/crenshaw2-1b and b/subx/apps/crenshaw2-1b differ diff --git a/subx/apps/dquotes b/subx/apps/dquotes index 49ca7a1a..3bcefaf0 100755 Binary files a/subx/apps/dquotes and b/subx/apps/dquotes differ diff --git a/subx/apps/factorial b/subx/apps/factorial index 820890e5..311ef05c 100755 Binary files a/subx/apps/factorial and b/subx/apps/factorial differ diff --git a/subx/apps/handle b/subx/apps/handle index 1ba82034..63f7511b 100755 Binary files a/subx/apps/handle and b/subx/apps/handle differ diff --git a/subx/apps/hex b/subx/apps/hex index 230e3f2d..f3ad62f1 100755 Binary files a/subx/apps/hex and b/subx/apps/hex differ diff --git a/subx/apps/pack b/subx/apps/pack index 757378f9..737d0c33 100755 Binary files a/subx/apps/pack and b/subx/apps/pack differ diff --git a/subx/apps/survey b/subx/apps/survey index 4d30e651..299ea71c 100755 Binary files a/subx/apps/survey and b/subx/apps/survey differ diff --git a/subx/apps/tests b/subx/apps/tests index 58ece991..00201e83 100755 Binary files a/subx/apps/tests and b/subx/apps/tests differ -- cgit 1.4.1-2-gfad0