about summary refs log tree commit diff stats
path: root/subx/035labels.cc
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-08-08 23:21:41 -0700
committerKartik Agaram <vc@akkartik.com>2018-08-08 23:21:41 -0700
commitf02ca8df04281d34b3fce035e0a501f28841982f (patch)
treeeabac0d9e47ec577acf0d299c92b56086b9219fb /subx/035labels.cc
parent87f72beedeb8fbce95e0b9ac961eb4cb2ca99bcf (diff)
downloadmu-f02ca8df04281d34b3fce035e0a501f28841982f.tar.gz
4496
Diffstat (limited to 'subx/035labels.cc')
-rw-r--r--subx/035labels.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/subx/035labels.cc b/subx/035labels.cc
index 9f584425..b3638c8b 100644
--- a/subx/035labels.cc
+++ b/subx/035labels.cc
@@ -49,10 +49,16 @@ void compute_addresses_for_labels(const segment& code, map<string, int32_t>& add
       }
       else {
         string label = drop_last(curr.data);
+        // ensure labels look sufficiently different from raw hex
         if (SIZE(label) <= 2) {
           raise << "label '" << label << "' is too short; must be more than two characters long\n" << end();
           return;
         }
+        // ensure labels look sufficiently different from hex literals
+        if (label.substr(0, 2) == "0x") {
+          raise << "label '" << label << "' looks like a hex number; use a different name\n" << end();
+          return;
+        }
         if (contains_any_operand_metadata(curr))
           raise << "'" << to_string(inst) << "': label definition (':') not allowed in operand\n" << end();
         if (j > 0)
@@ -177,3 +183,13 @@ loop3:
 xz:
             05                                                                                                                              0x0d0c0b0a/imm32  # add to EAX
 +error: label 'xz' is too short; must be more than two characters long
+
+:(scenario label_hex)
+% Hide_errors = true;
+== 0x1
+          # instruction                     effective address                                                   operand     displacement    immediate
+          # op          subop               mod             rm32          base        index         scale       r32
+          # 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes
+0xab:
+            05                                                                                                                              0x0d0c0b0a/imm32  # add to EAX
++error: label '0xab' looks like a hex number; use a different name