assembly 在最初的16位x86中是否有过8位内存寻址?

n9vozmp4  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(158)

在真实的模式与32位保护模式下,16位寻址用于通过ModR/M字节引用内存。这种寻址仅在使用传统前缀的i386指令中受支持,在x86-64指令中完全不受支持。
然而,ModR/M字节也被8位特定操作码使用,这让我怀疑原始16位x86指令集中是否存在8位寻址。尽管8位地址非常有限,但完全有可能以与16位指令相同的风格使用不同的操作码对这样的指令进行编码。
例如,将

add (bx, si), ax

你会有

add (bl, dh), al

很难找到任何i386之前的文档,所以我不知道。这曾经被支持过吗?

lyr7nygr

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
相关:

相关问题