2

这 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编写机器指令?如果db并且dw除了声明变量之外还有其他功能,它们是什么?有人可以指点我周围的更多文献db及其dw任何隐藏功能。

4

3 回答 3

4

想想在汇编的上下文中“声明变量”是什么意思。db并且dw,当提供一个值时,将该值直接写入内存。另一方面,代码作为字节存储在内存中。您可以通过让汇编程序处理您的汇编源来用字节填充内存,或者您可以查找指令编码并通过 db/dw/dd 命令用字节填充内存。

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

于 2013-04-04T02:23:24.533 回答
1

您可以通过使用某些汇编程序指令( , 等...)简单地插入正确的位来对指令进行硬db编码dw。在 16 位模式下,字节$EA0000FFFF反汇编为:

ljmp $0xffff,$0x0

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

于 2013-04-04T02:30:12.463 回答
0

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

于 2013-04-04T02:25:09.100 回答