Permit short intersegment jumps
authorH. Peter Anvin <hpa@linux.intel.com>
Thu, 6 May 2010 22:32:20 +0000 (15:32 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Thu, 6 May 2010 22:33:24 +0000 (15:33 -0700)
Allow an intersegment jump to be short (OUT_REL1ADR) if explicitly
specified so by the user.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
assemble.c

index 00ee78f..3932ab0 100644 (file)
@@ -1,6 +1,6 @@
 /* ----------------------------------------------------------------------- *
  *
- *   Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ *   Copyright 1996-2010 The NASM Authors - All Rights Reserved
  *   See the file AUTHORS included with the NASM distribution for
  *   the specific copyright holders.
  *
@@ -1336,14 +1336,18 @@ static void gencode(int32_t segment, int64_t offset, int bits,
             break;
 
        case4(050):
-            if (opx->segment != segment)
-                errfunc(ERR_NONFATAL,
-                        "short relative jump outside segment");
-            data = opx->offset - insn_end;
-            if (data > 127 || data < -128)
-                errfunc(ERR_NONFATAL, "short jump is out of range");
-            bytes[0] = data;
-            out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
+            if (opx->segment != segment) {
+                data = opx->offset;
+                out(offset, segment, &data,
+                    OUT_REL1ADR, insn_end - offset,
+                    opx->segment, opx->wrt);
+            } else {
+                data = opx->offset - insn_end;
+               if (data > 127 || data < -128)
+                   errfunc(ERR_NONFATAL, "short jump is out of range");
+                out(offset, segment, &data,
+                    OUT_ADDRESS, 1, NO_SEG, NO_SEG);
+            }
             offset += 1;
             break;