大部分是历史兴趣,如果我要为汇编程序实现8086兼容性,哪些操作数被认为对ESC
指令有效?
ESC opcode, source
从8086程序员手册我知道,opcode
是0到63范围内的立即数,source
是寄存器或内存。但是哪些寄存器可以编码? reg8
和reg16
或仅reg16
?如果source
是内存,操作数大小(mem8
或mem16
)是否重要?
基本上,上述两个方面从指令编码的角度来看并不重要(例如,esc 0x01, ch
和esc 0x01, bp
都会产生相同的结果),但是汇编程序可能会强制限制< / p>
最后,但并非最不重要,我在哪里可以找到ESC
操作码的说明?
答案 0 :(得分:7)
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操作完成后发生。