在实模式和32位保护模式下,16位寻址被用来通过ModR/M字节来引用内存。此寻址仅在使用遗留前缀的i386指令中得到支持,而在x86-64指令中则完全不受支持。
然而,8位特定的操作码也使用了ModR/M字节,这让我怀疑原始16位x86指令集中是否存在8位寻址。虽然8位地址是非常有限的,但完全有可能用不同的操作码以与16位指令相同的样式对这样的指令进行编码。
例如,而不是
add (bx, si), ax你会有
add (bl, dh), al很难找到任何前i 386文档,所以我处于黑暗之中。这支持过吗?
发布于 2022-10-18 14:50:03
只有通过XLAT,这样才能有效地执行mov al, [bx + al] (不能作为mov进行编码)。
现代16位实模式使用与8086相同的机器代码格式,这就是向后兼容的意思。(只有非常小的差别,比如现在指令长度限制为15字节,而8086将很高兴地获取无限数量的前缀,即使这意味着将IP封装在一个充满rep前缀的64k段中。)
x86 16位寻址模式列出了所有的ModRM模式:它们只包含16位寄存器。
add [bx + si], al是可编码的(如00 00),但add [bl + dh], al不是。
如果您想检查历史文档,可以使用8086个手册的PDF。此外,斯蒂芬·莫尔斯( Stephen ),8086年ISA的主要设计师,写了一本书“8086/8088入门”,现在可以在他的网站上免费获得:https://stevemorse.org/8086/。
早期的祖先8086,像8080,其中只有8位寄存器,x86 CPU.
相关信息:
ModRM [+ SIB]地址编码的32/64位模式版本也不能做到这一点。https://stackoverflow.com/questions/74111814
复制相似问题