65.9K
CodeProject 正在变化。 阅读更多。
Home

MS-DOS 下软重启

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.22/5 (5投票s)

2002年1月8日

2分钟阅读

viewsIcon

72951

让程序在 DOS 下避免硬件重启

为什么写这篇文章?

我们中的大多数人出于各种原因不得不使用 MS-DOS,例如故障排除 Windows、安装其他操作系统、更改 Windows 默认设置等等。但你有没有发现缺少什么?是的,你猜对了——重启。在使用 MS-DOS 时,我们总是需要使用硬件复位。这篇文章将解决你的问题。

详细说明

因此,我们将用 C/C++ 编写一个程序,以便在执行时使我们的系统重启。在代码之前,我想解释一些在编写之前需要考虑的主题。这些是

  • 函数指针
  • ROM BIOS 例程地址

开始吧

函数指针

对于我们中的许多人来说,这可能是一个奇怪的话题,因为我们都投入了编程生涯的一部分来理解指针,但很少有人接触过函数指针。因此,在继续之前请注意,函数确实占用内存,因此我们可以将指针分配给这些函数开始执行的内存位置。

声明函数指针

int (*function_ptr)() 是一个指向返回类型为整数的函数的指针。请记住,在使用指针时我们总是需要关注内存使用情况。

ROM BIOS 例程地址

现在我们都知道,ROM 芯片构成只读存储器,其中包含无法更改的程序。但你有没有想过 ROM 芯片包含那些在任何其他内容之前加载到内存中的程序(加载到内存 RAM 中),除非我们关闭计算机?因此,要编写一个重启我们计算机的程序,我们只需要第一个 ROM BIOS 例程的内存地址,该例程在我们启动计算机时立即执行。这个地址是 0xFFFF0000。我想,现在我们有能力编写代码了。

void main()
{
    void far(*p)(); //we need 32 bit pointer
    p=0xFFFF0000; //this is the location we are pointing to
    (*p)(); //calling
}

我不知道,为什么微软没有自己实现 DOS 重启。但你可以通过上面的代码的 .exe 文件来实现。

为什么这段代码在 Windows 下不起作用?

这段代码无法在 Windows 下工作,因为 Windows 在 DOS 的 1MB 内存之上运行。如果你在 Windows 下运行这段代码,你正在使用的窗口将会关闭。我为什么不只提供源代码?我认为一点描述会使上面的代码更容易理解。

© . All rights reserved.