在对IDE控制器的选项ROM进行逆向工程的过程中,我注意到每条in
或每条out
指令都跟着两条jmp short
指令,它们只是跳转到下一条指令(操作码EB00
),如下所示:
out dx, al jmp short next1 next1: jmp short next2 next2: ; code continues
这种模式背后的原因究竟是什么?
允许I/O设备处理在下一个数据到达之前发送给它的先前数据,当CPU开始以比I/O设备可以处理的速度更快的速度运行时.它经常与PIT定时器(8253)一起使用,其中需要两个8位OUT来在芯片的三个定时器之一中写入16位值.
此外,这是必要的,因为原始PC架构在I/O设备完成数据处理之前没有使用READY信号来停止CPU,因此等待必须在软件中执行.JMP非常适合,因为它引入了队列刷新,因此CPU浪费了一些执行实际跳转的周期.