首先需要您在网上下载NASM编译器,可以将汇编编译为二进制文件
可以运行的!并进行nasm为二进制文件,如下"test.asm"
至于为什么这么做的问题,您可以观看后面章节,现在只要按部就班的实际操作就好,运行起来才有直观感受,理论先放后面!
该段汇编主要是向显卡循环显示一个一个字符,最后取值为0就跳转fin执行HLT让CPU睡眠,死循环!
要显示一个字符,BIOS中断向量表中的int 0x10则满足条件,因为现在我们要制作OS就需要脱离现有系统的概率,我们现在什么功能都没有,没有系统的情况下,现在只有利用电脑主板厂商们提供的BIOS的基本输入输出系统进行简单编程,因为这些厂商基本已经完成了,而且电脑上最基本都有这些
AH=0X0E;AL=需要显示的字符code;BH=0;BL=颜色code
org 0x7C00 ;主引导记录的内存地址 启动区内存装载地址必须在0x7c00-0x7dff
jmp entry
entry:
mov ax, 0
mov ss, ax
mov ds, ax
mov es, ax
mov si, msg ;将msg地址赋给si
putLoop:
mov al, [si] ;等同 mov al, byte [si] 将si地址开始的一个字节的值放入al中
add si, 1 ;si = si+1
cmp al, 0 ;al与0比较
je fin ;上面比较相等 则跳转到fin 不相等则不跳转,执行后面命令
mov ah, 0x0e
int 0x10 ;中断
jmp putLoop
fin:
HLT ;暂停
jmp fin
msg:
DB 0x0a, 0x0a
DB "hello,jadeshu!"
DB 0X0a
DB 0
用nasm输出二进制文件
nasm -f bin test.asm -o test.bin
nasm -o test.bin test.asm
即可得到test.bin文件
如上图显示,如果想更换字符串(暂时不能超过510字节-开始汇编所产生二进制代码的长度),那么我们只要将上面二进制内的字符更换即可,那么我们就可以重新写一个文件得到最后的文件,如下所示:
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
public class OperatingSystem {
private int[] imgContent = new int[]{
0xE9, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x8E, 0xD0, 0x8E,
0xD8, 0x8E, 0xC0, 0xBE, 0x24, 0x7C, 0x8A, 0x04, 0x81,
0xC6, 0x01, 0x00, 0x3C, 0x00, 0x74, 0x07, 0xB4, 0x0E,
0xCD, 0x10, 0xE9, 0xEF, 0xFF, 0xF4, 0xE9, 0xFC, 0xFF,
0x0A, 0x0A
};
private ArrayList imgByteToWrite = new ArrayList();
public OperatingSystem(String s) {
// 将二进制汇编指令存入imgByteToWrite内
for (int i = 0; i < imgContent.length; i++) {
imgByteToWrite.add(imgContent[i]);
}
// 添加换行
imgByteToWrite.add(0x0a);
for (int j = 0; j < s.length(); j++) {
imgByteToWrite.add((int)s.charAt(j));
}
// 添加换行
imgByteToWrite.add(0x0a);
int len = 0x1fe;
int curSize = imgByteToWrite.size();
// 从前面字符有效位(curSize)一直到0x1fe位填充0数值
for (int k = 0; k < len - curSize; k++) {
imgByteToWrite.add(0);
}
// MBR引导区结束标志0xaa55
//0x1fe: 0x55
//0x1ff: 0xaa
imgByteToWrite.add(0x55);
imgByteToWrite.add(0xaa);
}
public void makeFllopy() {
try {
DataOutputStream out = new DataOutputStream(new FileOutputStream("system.img"));
for (int i = 0; i < imgByteToWrite.size(); i++) {
out.writeByte(imgByteToWrite.get(i).byteValue());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
OperatingSystem op = new OperatingSystem("hello,jadeshu!");
op.makeFllopy();
}
}
这里用java,你也可以用C/C++等都可以,最后输出一个system.img映射文件
C++来把我们用nasm编译的二进制CPU可执行的文件(test)写入0磁头0磁道1扇区位置,也就是我们经常所说的MBR引导区,详情看后面的章节
首先把上面汇编代码进行编译 cmd输入 nasm test.asm -o test 命令,即可得到test二进制文件,然后放入工程文件内即可。
代码HardDisk.h和HardDisk.cpp在第三章节,我们只要改变main.cpp文件即可,如下
#include "HardDisk.h"
int main()
{
CHardDisk disk;
// 章节一案例
disk.writeFileToDisk("test", true, 0, 1);
disk.makeVirtualDisk("system01.img");
system("pause");
return 0;
}
运行程序就可以生成一个system01.img二进制文件, 设置到虚拟机内,运行虚拟机即可,将会出现如上面图一样的界面!
打开虚拟机VMbox/VM新建一个虚拟机,挂载软盘指向此文件(system.img),然后启动虚拟机即可显示文字了;
虚拟机设置如下:
运行结果如下:
小提示:或者直接用bochs模拟软件附带的bximage.exe 直接创建img文件,具体点击这里查看