在真实的模式与32位保护模式下,16位寻址用于通过ModR/M字节引用内存。这种寻址仅在使用传统前缀的i386指令中受支持,在x86-64指令中完全不受支持。
然而,ModR/M字节也被8位特定操作码使用,这让我怀疑原始16位x86指令集中是否存在8位寻址。尽管8位地址非常有限,但完全有可能以与16位指令相同的风格使用不同的操作码对这样的指令进行编码。
例如,将
add (bx, si), ax
你会有
add (bl, dh), al
很难找到任何i386之前的文档,所以我不知道。这曾经被支持过吗?
1条答案
按热度按时间lyr7nygr1#
只能通过XLAT,它实际上执行
mov al, [bx + al]
(它 * 不能 * 编码为mov
)。现代的16位真实的模式使用与8086相同的机器码格式,这就是向后兼容的含义。(只有非常小的差别,比如现在有15字节的指令长度限制,而8086将很高兴地获取无限数量的前缀,即使这意味着在充满
rep
前缀的64 k数据段内环绕IP。)NASM x86 16-bit addressing modes列出了所有ModRM模式:它们只包括16位寄存器。
add [bx + si], al
是可编码的(如00 00
),但add [bl + dh], al
不是。如果你想查看历史文档,可以下载8086手册的PDF文件。另外,8086伊萨的主要设计师Stephen莫尔斯写了一本书“8086/8088入门”,现在可以在他的网站上免费获得:https://stevemorse.org/8086/。
8086的早期祖先,如8080,它只有8位寄存器,are not x86 CPUs。
相关:
ModRM [+ SIB]
地址编码也不能做到这一点。