In real mode and 32-bit protected mode, 16-bit addressing is used to reference memory via the ModR/M byte. This addressing is only supported in i386 instructions with use of legacy prefixes, and entirely unsupported in x86-64 instructions.
However, the ModR/M byte is also used by the 8-bit specific opcodes, which makes me question if 8-bit addressing was present in the original 16-bit x86 instruction set. Although an 8-bit address is very limited, it'd be entirely possible to encode such an instruction in the same style as 16-bit instructions with a different opcode.
For example, instead of
add (bx, si), ax
you'd have
add (bl, dh), al
It's hard to find any pre-i386 documentation, so I'm in the dark. Was this ever supported?
Only via XLAT, which effectively does mov al, [bx + al]
(which is not encodeable as a mov
).
Modern 16-bit real mode uses the same machine-code format as 8086, that's what it means to be backwards compatible. (With only very minor differences, like that there's now an instruction-length limit of 15 bytes, vs. 8086 would happily fetch an unlimited number of prefixes, even if that meant wrapping around IP within a 64k segment full of rep
prefixes.)
NASM x86 16-bit addressing modes lists all the ModRM modes: they only include 16-bit registers.
add [bx + si], al
is encodeable (as 00 00
), but add [bl + dh], al
isn't.
PDFs of 8086 manuals are available if you want to check historical documents. Also, Stephen Morse, the primary architect of 8086's ISA, wrote a book "The 8086/8088 primer", which is now available for free on his web site: https://stevemorse.org/8086/.
Earlier ancestors of 8086, like 8080 which only has 8-bit registers, are not x86 CPUs.
Related:
ModRM [+ SIB]
address encoding can't do that either.