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

Assembly 这些特定的汇编指令(使用db和dw)是如何导致计算机重新启动的?,assembly,x86,bootloader,Assembly,X86,Bootloader,这3条汇编指令如何导致计算机重新启动 db 0x0ea dw 0x0000 dw 0xffff 这是我从你家找到的 据我所知,这3条指令将您发送到FFFF:0000,即内存的末尾,通过调用BIOS POST导致重新启动。但是不应该有一个jmp指令来进行跳转吗 另外,在我看来,在db0x0ea中,ea是jmp的机器指令。如果是这样的话,db 0x0ea如何编写机器指令?如果db和dw除了声明变量之外还有其他功能,它们是什么?有人能给我指出更多关于db和dw及其任何隐藏函数的文献吗。思考一下“

这3条汇编指令如何导致计算机重新启动

db 0x0ea 
dw 0x0000 
dw 0xffff
这是我从你家找到的

据我所知,这3条指令将您发送到
FFFF:0000
,即内存的末尾,通过调用BIOS POST导致重新启动。但是不应该有一个
jmp
指令来进行跳转吗

另外,在我看来,在
db0x0ea
中,ea是
jmp
的机器指令。如果是这样的话,
db 0x0ea
如何编写机器指令?如果
db
dw
除了声明变量之外还有其他功能,它们是什么?有人能给我指出更多关于
db
dw
及其任何隐藏函数的文献吗。

思考一下“声明变量”在汇编上下文中的含义
db
dw
提供值时,将该值直接写入内存。另一方面,代码和字节也存储在内存中。通过让汇编程序处理汇编源代码,可以用字节填充内存,也可以通过db/dw/dd命令查找指令编码并用字节填充内存


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

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

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

ljmp $0xffff,$0x0

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

还请注意,如果您需要插入这样的指令(而不是能够执行类似于
jmp far 0xFFFF:0x0000的操作),因此,作为这些db和dw的间接使用,我可以通过键入每条指令及其数据的十六进制代码,使用db、dw、dd等来编写整个程序。。。我说的对吗?@语法如果做得好,是的-尽管你必须非常小心地正确编码指令位。这样说吧,如果你拿了一个文件并查看了它的十六进制位,然后正确地设置了你的汇编指令,并制作了足够的
db
,以克隆原始文件,当你组装它时,你应该得到相同的文件-一个程序或其他。