主要是历史兴趣,如果我要为汇编程序实现8086兼容性,哪些操作数被认为对ESC指令有效?
ESC opcode, source
从8086程序员手册我知道,这opcode是0到63范围内的立即数,source是一个寄存器或存储器.但是哪些寄存器可以编码?是reg8和reg16否reg16?如果source是内存,操作数大小(mem8或mem16)是否重要?
基本上,无论是上述的真的不从指令编码的角度关系(如,例如,两者esc 0x01, ch并esc 0x01, bp会产生相同的结果),但也许装配强迫限制
而且,最后,但并非最不重要,我在哪里可以找到ESC操作码的描述?
8086具有共同指定的操作码空间ESC(逃逸到协处理器).它占据了范围d8到df.该指令空间中的每条指令后跟一个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操作完成.