将操作码解码为指令

Decoding opcode to instruction

这个汇编例程的前 2 条指令是直接用机器代码编写的,如何将它们翻译成标准形式(我猜它类似于 add %bp, %bx,但它没有意义,因为这个例程应该清空 8042 缓冲区)?

   func:
        .word   0x00eb,0x00eb
        in  , %al
        test    %al, 
        jnz func
        ret

通常您会为此使用调试器。

db 0EBh, 00h是空跳转,即跳转到紧跟其后的指令。

Expanding on 500 - Internal Sever Error 的答案,代码是:

func:   jmp     short func0
func0:  jmp     short func1
func1:  in      , %al
        test    %al, 
        jnz     func
        ret

到下一条指令的两次跳转用于创建一个短暂的延迟。在使用某些 I/O 端口操作时,某些 8088 / 8086 / 80186 / 80286 / ... 类型的环境可能需要这样做。例如,在早期的 IBM AT 中,在某些情况下,AT / ISA 总线 运行 比一些较旧的 ISA 类型外设卡设计 运行 的速度要快一点,所以跳转到下一条指令被用作延迟。