首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这些特定的汇编指令(使用db和dw)如何导致计算机重新启动?

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

Stack Overflow用户
提问于 2013-04-04 10:08:05
回答 3查看 804关注 0票数 2

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

代码语言:javascript
运行
复制
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及其隐藏功能的文献。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-04 10:23:25

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-04-04 10:30:12

只需使用某些汇编指令(dbdw等)插入适当的位,就可以对指令进行硬编码。在16位模式下,$EA0000FFFF将字节反汇编为:

代码语言:javascript
运行
复制
ljmp $0xffff,$0x0

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-04 10:25:09

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15801384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档