什么是8086 ESC指令操作码

时间:2017-03-01 23:11:43

标签: assembly x86-16

大部分是历史兴趣,如果我要为汇编程序实现8086兼容性,哪些操作数被认为对ESC指令有效?

ESC opcode, source

从8086程序员手册我知道,opcode是0到63范围内的立即数,source是寄存器或内存。但是哪些寄存器可以编码? reg8reg16或仅reg16?如果source是内存,操作数大小(mem8mem16)是否重要?

基本上,上述两个方面从指令编码的角度来看并不重要(例如,esc 0x01, chesc 0x01, bp都会产生相同的结果),但是汇编程序可能会强制限制< / p>

最后,但并非最不重要,我在哪里可以找到ESC操作码的说明?

1 个答案:

答案 0 :(得分:7)

8086的操作码空间统称为ESC(转义为协处理器)。它占据d8df的范围。该指令空间中的每条指令后跟一个modr / m字节,并且根据mod-field,零到两个处理字节。当8086遇到带有两个寄存器操作数的ESC指令(即mod = 11)时,它执行一个nop。当处理器遇到带有内存操作数的ESC指令时,将从内存操作数指示的地址执行读周期,结果将被丢弃。

使用两条特殊的信号线,协处理器可以区分数据读取和指令提取,允许它与8086并行解码指令流。

8087使用这种机制挂钩到指令流:操作码字节中的三个可用位以及modr / m字节中的reg字段的三个位形成一个六位操作码。 modr / m字节的r / m字段用于指定FPU寄存器堆栈上的位置(如果mod = 11,表示两个寄存器操作数)或存储器操作数。一些操作码根据r / m字段的内容编码各种指令。在所有这些情况下,一条指令被编码用于存储器操作数,而另外八条指令被编码用于每个可能的寄存器操作数。

当8086在获取指令后立即执行虚拟提取并记住地址时,8087进行寄存器。如果指令从内存加载,它将加载内存操作数的附加字并执行其功能。如果是商店,它会忽略获取的结果并将其值存储到8086指示的地址。

8087与8086异步执行操作.8086在另一条指令正在进行时尝试调度浮点指令时停止。但是,不存在其他隐式同步。 8087在执行操作时断言其BUSY引脚(连接到8086的TEST引脚),程序员可以发出wait指令(9b,等待协处理器就绪)到等到8087结束操作并因此释放WAIT行。这通常在尝试读取8087从8086写入的内存操作数之前完成。但是,通常手动计算8087对某个指令要花多长时间并在加载时省略wait。保证在FPU操作完成后发生。