assembly - x86 汇编中端口 I/O 后 jmp 短接的用途

标签 assembly x86

在对 IDE Controller 的选项 ROM 进行逆向工程的过程中,我注意到每个 inout 指令后面都跟着两个 jmp Short 指令,它只是跳转到下一条指令(操作码 EB00),如下所示:

    out dx, al
    jmp short next1
next1:
    jmp short next2
next2:
    ; code continues

这种模式背后的具体原因是什么?

最佳答案

当 CPU 开始以超过 I/O 设备处理速度的速度运行时,允许 I/O 设备在下一个数据到达之前处理之前发送给它的数据。它经常与 PIT 定时器 (8253) 一起使用,其中需要两个 8 位 OUT 才能在芯片的三个定时器之一中写入 16 位值。

此外,这是必要的,因为原始的PC架构并没有使用READY信号来停止CPU,直到I/O设备处理完数据,因此必须在软件中执行等待。 JMP 非常适合,因为它引入了队列刷新,因此 CPU 浪费了一些周期来执行实际跳转。

关于assembly - x86 汇编中端口 I/O 后 jmp 短接的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319065/

相关文章:

feenableexcept 会损害程序性能吗?

c - 水平翻转 1bpp .bmp 图像

assembly - 上面的跳转在 AT&T 汇编格式中如何工作

c++ - 除了检查发出的机器代码之外,我如何找到 C++ 编译器如何实现某些东西?

assembly - 防止 AX 寄存器被 DIV 指令破坏

c++ - RDTSCP 和指令顺序

delphi - 将 Assembler x86 CPU ID 代码移植到 AMD64

android - 在 Linux 桌面上运行 Android NDK 二进制文件

c++ - 调用 always_inline '__m256d _mm256_broadcast_sd(const double*)' 时内联失败

assembly - 在 16 位 x86 汇编中注册中断