我想你的问题的第一部分已经回答了,所以我将讨论另外两个:
我可以使用什么汇编程序以及如何使用它将 ASM 汇编为机器代码?
, (基本上非常喜欢), , "masm" ie 之一,nasm
并且作为 Microsoft 工具的一部分免费提供。yasm
nasm
fasm
ml64.exe
ml.exe
其中,我可能会推荐nasm
或yasm
。该建议完全基于个人喜好 - 但他们支持的广泛平台以及默认使用英特尔语法是我的原因。我会尝试一些,看看你喜欢什么。
(可选)您如何建议将机器代码放置在正确的地址中(即引导加载程序机器代码必须放置在引导扇区中)?
好吧,只有一种方法可以将引导加载程序放置在 MBR 的正确地址 - 打开 LBA 0 处的磁盘并在那里准确写入 512 个字节,以0x55AA
. 冲洗,然后关闭。MBR 通常还包含一个嵌入其中的分区表——它既是代码又是数据。这个东西的科学术语是冯诺依曼架构,可以简单概括为“程序和数据存储在同一个地方”。BIOS 想要从磁盘启动时的操作是将前 512 个字节读入内存,检查签名,如果匹配,则执行该内存(从字节 0 开始)。
好的,这些问题就不用说了。现在我再给你一些注意事项:
- 引导加载程序的 512 字节对于任何人来说都不够用。因此,一些文件系统包含引导扇区,引导加载程序本身只是加载在这些扇区中找到的代码/数据。这允许加载更大量的代码——足以让内核运行。例如,grub 在旧版本中包含 stage1、stage1_5 和 stage2 组件。
尽管大多数操作系统都要求您使用可执行格式容器,但您并不需要。在磁盘和内存中,可执行代码只是一个、两个或三个字节的字符串,称为操作码。您可以阅读操作码参考或 Intel/AMD 手册以了解十六进制值转换为什么。无论如何,您可以使用 nasm 执行从汇编程序到二进制文件的直接转换,如下所示:
nasm -f bin input.asm -o output.asm
尽管结果可能不会执行,但它非常适用于 16、32 或 64 位汇编程序。唯一的地方是,如果您[bits 16]
在代码中显式使用该指令以及org 100h
,那么您将拥有一个 MSDOS .com 程序。不幸的是,这是现有的最简单的二进制格式——你只有一大块代码和数据,而且不能超过单个段的大小。
我觉得这可能会解决这一点:
我找到了各种答案,包括机器代码、二进制、普通二进制、原始二进制、汇编和可重定位目标代码。
关于汇编组装成什么的答案 - 它组装成操作码和内存地址,具体取决于汇编程序。这以字节表示,这些字节本身就是数据。您可以使用十六进制编辑器原始阅读它们,尽管在少数情况下这是绝对必要的。我提到内存地址是因为一些操作码控制如何解释内存地址 - 例如,可重定位目标代码要求地址不是硬编码的(相反,它们被解释为与当前位置的偏移量)。
据我了解,程序集通常会组装成 PE 格式的可执行文件。
可以公平地说,派生出 C/C++ 的汇编器被编译为操作码,然后这些操作码与程序中包含的任何其他内容(数据、资源)一起以可执行格式(例如 PE)存储。通常取决于您的操作系统。
如果你彻底阅读了 OSDev Wiki,你会意识到分段寻址是一件非常痛苦的事情——现代操作系统中段的标准和唯一用法是定义跨越整个地址空间的四个段——在环 0 和 3 处的两个数据段,在环 0 和 3 的两个代码段。
如果您还没有彻底阅读OSDEV Wiki,那么您应该阅读。我还推荐JamesM 的内核教程,其中包含有关在 C 中构建内核的实用建议。
如果你只是想对一个 DOS 内核做坏事,你实际上仍然可以不需要自己编写一个完整的内核。您还应该能够将 CPU 从 DOS 切换到保护模式。您需要FreeDOS和您选择的汇编程序。有一个关于终止和保持驻留的优秀教程,这基本上意味着挂钩一个中断例程,然后将自己从活动进程列表中编辑出来,在Rootkit 兵工厂。互联网上可能也有这方面的教程。
我可能很想建议首先这样做,只是为了让自己习惯这种低级的东西。
- 如果你只是想戳一个操作系统,你可以在 Windows 上设置内核调试。WinDbg 有点……晦涩难懂,但一旦你习惯了它就会变得有意义。
- 您提到您的笔记本电脑使用安全启动。如果是这种情况,您的笔记本电脑使用 UEFI。如果您想阅读此内容,UEFI 规范100% 保证比您的数学作业更无聊,但我建议您略读它以了解目标和基本环境。重要的是拥有EFI SDK,它使您能够构建与 EFI 兼容的应用程序(PE 格式并存在于磁盘上的 FAT32 分区上 - 因此安装 EFI 引导加载程序非常简单,即使编写一个不是这样。如果我必须提出一个诚实的建议,我现在会坚持使用 MBR,因为在撰写本文时使用 MBR 模拟操作系统比 EFI 容易得多,而且您现在确实想在某种形式的 VM 中执行此操作. 另外,我会使用现有的 grub,因为引导加载程序并不是那么令人兴奋,真的。
- 别人说了,我就说:你绝对想在某种形式的模拟器或虚拟机下做这样的事情。你肯定会犯错,而且你会遇到你不理解的事情。模拟器和虚拟机软件现在是免费的,有些像 BOCHS 会告诉你给定故障、陷阱等的原因是什么。这很有帮助!