assembly 如何将bin文件(512字节)写入软盘的第一个扇区(扇区0)?

gg58donl  于 2022-11-13  发布在  其他
关注(0)|答案(4)|浏览(315)

如何在软盘/虚拟软盘/软盘映像的第一个扇区中写入.bin文件?
我正在尝试 Boot 一个简单的512字节的引导加载程序。到处都显示“512字节”,所以我应该已经很好了。

其他信息:

引导加载程序只是显示一个字符串,我正在学习simpleassembly。一些工作是在Windows中完成的,一些是在Ubuntu 14.04(Trusty Tahr)中完成的(如果这很重要的话)。
即使它有引导加载程序标志,它也不会 Boot 。

t3psigkw

t3psigkw1#

如果你在Linux上,你可以用 DD 实用程序来做。也有一个用于Microsoft Windows的 DD 版本。

一般DD用法

如果您希望创建一个720 K软盘大小的零填充虚拟磁盘映像,您可以像这样使用 dd

dd if=/dev/zero of=disk.img bs=1024 count=720

这将创建一个名为disk.img的文件,大小为1024*720 = 737280字节。可以使用以下命令创建一个1.44MB的填充为零的软盘映像:

dd if=/dev/zero of=disk.img bs=1024 count=1440

将二进制映像写入虚拟软盘(从映像的开头开始)的方法如下:

dd if=bootload.bin of=disk.img conv=notrunc

这个例子取文件bootload.bin,并将其放置在磁盘映像的开头(在本例中称为disk.img),而不截断(conv=notrunc)如果您不在虚拟磁盘映像上使用conv=notrunc,它将写入bootload.bin,并将磁盘映像截断为引导加载程序的大小。

  • DD* 还可以通过跳转到磁盘开头以外的点来写入磁盘映像的特定部分。如果您需要将信息(代码/数据)放在特定扇区中,这将非常有用。此示例可用于将 Boot 加载程序的第二阶段放在磁盘映像的第一个512字节扇区之后:
dd if=stage2.bin of=disk.img bs=512 seek=1 conv=notrunc

bs=512将块大小设置为512(由于这是大多数软盘扇区的典型大小,因此更容易)。seek=1查找超过映像开头的第一个块(512字节),然后写入文件stage2.bin。我们再次需要conv=notrunc,因为我们不希望 DDstage2.bin结束处截断磁盘映像。

dd if=stage2.bin of=disk.img bs=512 seek=18 conv=notrunc

此示例与上一个示例类似,但在写入stage2.bin之前跳过了9216字节(512*18
如果你有一个连接到Linux系统的软盘(和根访问),你可以写引导加载程序与

dd if=bootload.bin of=/dev/fd0

其中/dev/fd0是软盘的设备。/dev/fd0通常是软盘A(如果有),/dev/fd1是软盘B(如果有)。

适用于Windows的DD

如果您运行的是Microsoft Windows,则有一个可用的 DD 实用程序版本here。最新下载的版本是dd-0.6beta3.zip,这是推荐的最低版本。它具有一些旧版本没有的功能。只需打开zip文件并将其解压缩到Windows路径中的某个位置。

dy1byipe

dy1byipe2#

用于DOS的DD

如果你在DOS下工作,我最近偶然发现了这篇文章:https://sourceforge.net/p/freedos/mailman/message/21492772/
它指向下面下载的gnu tools for DOS:http://www.ibiblio.org/pub/micro/pc-stuff/freedos/gnuish/gnufut21.zip
此命令在MS DOS 6.22中工作,用于将.bin文件写入A驱动器(使用风险自担!)

dd if=c:\wherever\your\bin.bin of=0:

其中bin.bin的大小应为512字节,0:应该指向A驱动器。

qgelzfjb

qgelzfjb3#

听起来很有趣。
我以前写过很多次软盘的前512个字节,我想更深入地了解它。
Roadkil的扇区编辑器可以做到这一点,它可以让你在屏幕上打开前512个字节,并将其保存到一个文件,然后打开一个文件与前512个字节,并将其保存到软盘。
http://www.roadkil.net/program.php?ProgramID=24
有趣的是,有一个经典的网站是关于引导东西的,由一个名字和你相似的人创建的,starman ..http://starman.vertcomp.com/asm/mbr/虽然软盘是非分区介质,因此没有MBR。
我肯定我已经保存了前512字节从例如一个Windows 98软盘,它说启动Windows 98然后去了一个C提示符。它可以改变为例如一个Windows 95软盘。你知道XP可以有一个3文件 Boot 盘,如果有一个问题的3核心文件。它有一个独特的 Boot 扇区。它不是一个DOS引导盘。我记得XP中的format命令和98中的不一样。98中的像DOS中的一样,它有一个format /s来制作系统盘。我认为XP真的不能。我注意到Win7的format命令也不能。虽然在XP或7中,我认为你可以通过在“我的电脑”中右键单击A后勾选一个框来从GUI中制作一个dos Boot 盘。另一个你可以使用的命令是 *nix风格的dd命令。或ddrescue(它提供了比dd更多的信息)。一个类似的程序是Bart的BBIE,它可以获取CD的可引导部分并将其解压。Nero是(也许现在仍然是),能够从软盘的 Boot 扇区(512字节)创建一个基于它的CD。因此,如果你有一个可引导的DOS磁盘,你就可以制作一个可引导的DOS CD。它有一个选项,既可以让你浏览到带有该引导记录的映像,或者只是把软盘放进去让它解压。

jm81lzqq

jm81lzqq4#

要将一个文件写入另一个文件,你可以编写一个程序。

char buf[512];
int floppy_desc, file_desc;
file_desc = open("xx.bin", O_RDONLY);
read(file_desc, buf, 512);
close(file_desc);

floppy_desc = open("floppy.img", O_RDWR);
lseek(floppy_desc, 512, SEEK_SET);
write(floppy_desc, buf, 512);
close(floppy_desc);

相关问题