这些特定的汇编程序指令(使用db和dw)如何导致计算机重新启动?

时间:2013-04-04 02:08:05

标签: assembly x86 bootloader

这3个汇编程序指令如何导致计算机重启?

db 0x0ea 
dw 0x0000 
dw 0xffff

我是从http://fisnikhasani.com/building-your-own-bootloader/

找到的

就我的理解而言,这3条指令会将您发送到FFFF:0000,即通过调用BIOS POST导致重启的内存结束。但是,为了实现这种跳跃,不应该有jmp指令吗?

另外,在我看来,在db 0x0ea中,ea是jmp的机器指令。如果是这样,db 0x0ea如何编写机器指令?如果dbdw除了声明变量之外还有其他功能,那么它们是什么?有人可以请我参考更多关于dbdw及其任何隐藏功能的文献。

3 个答案:

答案 0 :(得分:4)

想一想“声明变量”在汇编语境中的含义。 dbdw,当提供值时,将该值直接写入内存。另一方面,代码以字节存储在存储器中。您可以通过汇编程序处理汇编源来填充内存,或者您可以通过db / dw / dd命令查找指令编码并用字节填充内存。

这就是他们在这里所做的。这个字节序列 - ea 00 00 ff ff - 对jmp far 0ffffh:0命令进行编码。

答案 1 :(得分:1)

您可以通过使用某些汇编程序指令(dbdw等)插入适当的位来硬编码指令。在16位模式下,字节$EA0000FFFF反汇编为:

ljmp $0xffff,$0x0

将值$FFFF放在CS(代码段)寄存器中,将$0000置于IP(指令指针)中。这有效地开始从计算机的reset vector开始执行代码,该代码应继续引导系统,就好像你只是打开它一样。

答案 2 :(得分:0)

dbdw不是汇编指令,它们是指令。它们的参数仅用于初始化伪指令分配的字节或字。当它们在代码段中使用时,它们可用于创建可执行代码。