Assembly 为什么字节是“0”;0xea 0000 ffff“;在引导加载程序中,是否导致计算机重新启动?

Assembly 为什么字节是“0”;0xea 0000 ffff“;在引导加载程序中,是否导致计算机重新启动?,assembly,x86,bootloader,bios,reboot,Assembly,X86,Bootloader,Bios,Reboot,我在研究引导加载程序,发现了这个有趣的组件: ;Sends us to the end of the memory ;causing reboot db 0x0ea dw 0x0000 dw 0xffff 通过评论,我知道它的作用;将计算机发送到内存末尾,但我不知道这些数字如何重新启动计算机(16位模式下的x86_64处理器) 这是一条跳远指令,指向旧的8086重置地址。当8086复位时,它将开始执行FFFF:0000处的指令。出于兼容性原因,现代BIOS实现在此处跳转到其重置代码,尽管现代C

我在研究引导加载程序,发现了这个有趣的组件:

;Sends us to the end of the memory
;causing reboot
db 0x0ea
dw 0x0000
dw 0xffff

通过评论,我知道它的作用;将计算机发送到内存末尾,但我不知道这些数字如何重新启动计算机(16位模式下的x86_64处理器)

这是一条跳远指令,指向旧的8086重置地址。当8086复位时,它将开始执行FFFF:0000处的指令。出于兼容性原因,现代BIOS实现在此处跳转到其重置代码,尽管现代CPU的重置地址不同。

这些字节对应于
jmp字0xffff:0000
(您可以通过使用NASM组装然后反汇编生成的二进制文件来看到这一点),这是一个跳转到真正的模式。< /P>重置地址仍然适用于我的2014 MacBook Pro,虽然我会认为相当现代;正如我所说,从总体上说是的,现代BIOS实现支持这种向后兼容性。但是,CPU在复位后实际上开始在FFFF000:FFF0处执行指令。它是在保护模式下开始的吗?@当CPU复位(包括通电时)时,通常是在实模式下开始执行BIOS代码(复位地址不是有效的实模式地址,但它仍然有效)。BIOS代码初始化硬件,进行自检,然后查找要引导的内容。当它找到您的引导加载程序时,它会在0000:7C00时将其加载到内存中并跳转到它。@无论您告诉它到哪里,它都会自动跳转。通常,引导加载程序是启动操作系统过程的一部分,因此引导加载程序将操作系统加载到内存中,然后跳到操作系统的开始处。引导加载程序不能只是完成,它需要在完成它应该做的任何事情时跳转到其他代码。要么这样,要么在无限循环中运行,永远不会结束。您看到的
JMP FFFF:0000
指令通过跳回BIOS结束引导加载程序。这会导致BIOS的行为就像CPU被重置一样,就像你先关闭计算机,然后再打开一样。所以我猜这只是有人试图耍花招。如果我只是用
jmp-word 0xffff:0000
替换这些行,您认为会更清楚吗?肯定会更清楚。请注意,跳转指令的确切语法将取决于您使用的汇编器。@总的来说,使用DB/DW指令的人可能只是不知道如何使用他的汇编器编写16位跳转指令。语法可能有点棘手。在Linux内核4.2上: