Permit short intersegment jumps

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>
This commit is contained in:
H. Peter Anvin 2010-05-06 15:32:20 -07:00
parent 55ae12052c
commit fea84d7fec

View 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 * See the file AUTHORS included with the NASM distribution for
* the specific copyright holders. * the specific copyright holders.
* *
@ -1336,14 +1336,18 @@ static void gencode(int32_t segment, int64_t offset, int bits,
break; break;
case4(050): case4(050):
if (opx->segment != segment) if (opx->segment != segment) {
errfunc(ERR_NONFATAL, data = opx->offset;
"short relative jump outside segment"); out(offset, segment, &data,
data = opx->offset - insn_end; OUT_REL1ADR, insn_end - offset,
if (data > 127 || data < -128) opx->segment, opx->wrt);
errfunc(ERR_NONFATAL, "short jump is out of range"); } else {
bytes[0] = data; data = opx->offset - insn_end;
out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG); 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; offset += 1;
break; break;