这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
及其任何隐藏功能的文献。
答案 0 :(得分:4)
想一想“声明变量”在汇编语境中的含义。 db
和dw
,当提供值时,将该值直接写入内存。另一方面,代码以字节存储在存储器中。您可以通过汇编程序处理汇编源来填充内存,或者您可以通过db / dw / dd命令查找指令编码并用字节填充内存。
这就是他们在这里所做的。这个字节序列 - ea 00 00 ff ff - 对jmp far 0ffffh:0
命令进行编码。
答案 1 :(得分:1)
您可以通过使用某些汇编程序指令(db
,dw
等)插入适当的位来硬编码指令。在16位模式下,字节$EA0000FFFF
反汇编为:
ljmp $0xffff,$0x0
将值$FFFF
放在CS
(代码段)寄存器中,将$0000
置于IP
(指令指针)中。这有效地开始从计算机的reset vector开始执行代码,该代码应继续引导系统,就好像你只是打开它一样。
答案 2 :(得分:0)
db
和dw
不是汇编指令,它们是伪指令。它们的参数仅用于初始化伪指令分配的字节或字。当它们在代码段中使用时,它们可用于创建可执行代码。