什么是8086 ESC指令操作码

Ale*_*hak 4 assembly x86-16

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

ESC opcode, source

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

基本上,无论是上述的真的不从指令编码的角度关系(如,例如,两者esc 0x01, chesc 0x01, bp会产生相同的结果),但也许装配强迫限制

而且,最后,但并非最不重要,我在哪里可以找到ESC操作码的描述?

fuz*_*fuz 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操作完成.

  • @SasQ ESC 操作码都具有相同的格式:一个操作码字节后跟一个 modrm 字节,如果由 modrm 字节指定,则为适当的位移字节。 (3认同)
  • “8086在取指令后立即执行dummy fetch时8087寄存器并记住地址”这句话我花了一些时间才能理解!我一直把“8087 registers”读作名词,你肯定是指动词。我是否可以建议“8087 记录时...”或“8086 标记时...” 其他人可能有同样的困难或根本不在乎。 (2认同)