试想,如果调试程序将断点下在 ROM 程序中,遇到断点,总要执行 int01 或者 int03 指令,而这些指令都要使用堆栈。如果堆栈放在 ROM 中,那么使用堆栈的指令必然失败,因为 ROM 是只读的,写进去的 CS 和 IP 都被丢弃了。
好了,小心一点,每次碰到这条设置 SS 的指令,就让它跳过,不要执行它。然而,这个 ROM 程序还有别的反跟踪手段:我不知道执行到什么地方,在一条 out 指令后,屏幕上干净了,像清屏了一样。键盘还没死锁,因为我按 NumLock 键,键盘指示灯有反应。摸黑按调试命令 g,可以顺利启动下去,进入操作系统中。
干脆在 ROM 中查找 CD 1A 这个字符串(就是 int1A 的机器汇编码)。结果找到了一段程序,我猜想这应该就是 PCI 设备的初始化程序了。可是用这段程序以后,GRUB.EXE 死得更彻底了,郁闷。