(1)打造简单OS-汇编写入引导区,虚拟机启动步骤
首先需要您在网上下载NASM编译器,可以将汇编编译为二进制文件
1.写一段汇编代码在屏幕上打印一段字符,可以运行的!并进行nasm为二进制文件,如下"test.asm"
该段汇编主要是向显卡循环显示一个一个字符,最后取值为0就跳转fin执行HLT让CPU睡眠,死循环!
要显示一个字符,int 0x10则满足条件
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文件
2.用文本工具打开test.bin查看16位进制数
3.如您擅长C++,那么可跳过此JAVA节直接观看第4点 即可。如上图显示,如果想更换字符串(暂时不能超过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<Integer> imgByteToWrite = new ArrayList<Integer>();
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映射文件
打开虚拟机VMbox/VM新建一个虚拟机,挂载软盘指向此文件(system.img),然后启动虚拟机即可显示文字了;
虚拟机设置如下:
运行结果如下:
4.下面开始使用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二进制文件, 设置到虚拟机内,运行虚拟机即可,将会出现如上面图一样的界面!
5.还可以如汇编打印文字章节中描述那有打印
(1)打造简单OS-汇编写入引导区,虚拟机启动步骤的更多相关文章
- (3)打造简单OS-MBR引导区转移加载简单程序(突破512限制)
在第一节<(1)汇编写入引导区,虚拟机启动步骤>中讲解到一个简单屏幕显示一川字符串,第二节讲到BIOS启动过程! 第一节中基本原理就是将那个汇编代码用nasm汇编器进行汇编成二进制,然后把 ...
- 打造简单OS-总目录
1-汇编写入引导区,虚拟机启动步骤 (了解即可) 2-开机BIOS初始化与MBR操作系统引导详解 (了解即可) 3-MBR引导区转移加载简单程序(突破512限制)(了解即可) 4-loader硬盘加载 ...
- (4.1)打造简单OS-小实验[图形显示]
主要是实现<简单打造OS>第四小节说到的一个图形界面的实验项目 1.mbr boot.inc ;------------- loader和kernel ---------- LOADER_ ...
- (7)打造简单OS-加载内核
一.简要说明 我们在第五讲[(5)打造简单OS-进入保护模式]中的mbr.S 汇编文件有段这样的代码 mov eax, 0x2 ; 起始扇区lba地址,从间隔第二个扇区开始 mov bx, 0x900 ...
- 病毒木马查杀实战第023篇:MBR病毒之引导区的解析
前言 引导型病毒指寄生在磁盘引导区或主引导区的计算机病毒.这种病毒利用系统引导时,不对主引导区的内容正确与否进行判别的缺点,在引导系统的过程中入侵系统,驻留内存,监视系统运行,伺机传染和破坏.按照引导 ...
- 纯手工打造简单分布式爬虫(Python)
前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...
- 病毒木马查杀实战第024篇:MBR病毒之编程解析引导区
前言 通过之前的学习,相信大家已经对磁盘的引导区有了充分的认识.但是我们之前的学习都是利用现成的工具来对引导区进行解析的,而对于一名反病毒工程师而言,不单单需要有扎实的逆向分析功底,同时也需要有很强的 ...
- 自制一个能显示helloworld的最简单OS
<自己动手写操作系统> org 07c00h mov ax,cs mov ds,ax mov es,ax call DispStr jmp $ DispStr: mov ax,BootMe ...
- 使用Vs2005打造简单分页浏览器(1)原创
原文:使用Vs2005打造简单分页浏览器(1)原创 使用Vs2005打造简单分页浏览器(1)原创1引言2功能3实现过程以及关键点4总结5不足之处6其他7 代码下载 1 引言很早就有搞一个浏览器的 ...
随机推荐
- [skill] ctags支持函数声明
一般情况下,使用ctags的时候,默认使用如下命令: ctags -R ./ 但是这种情况下,如果运行在include文件夹下的时候,好多函数是跳转不过去的,因为这种默认情况下,函数声明并不会被索引. ...
- xca自签发证书解决chrome浏览器证书不可信问题记录
xca打开的界面 依次File, New DataBase,选择xdb文件保存路径,再输入密码 切换到Certificates页面,点击New Certificate 出现如下界面 因为要创建根证书, ...
- 使用Redis 计数器防止刷接口
业务需求中经常有需要用到计数器的场景:为了防止恶意刷接口,需要设置一个接口每个IP一分钟.一天等的调用次数阈值:为了降低费用,限制发送短信的次数等.使用Redis的Incr自增命令可以轻松实现以上需求 ...
- python练习题-day4
1.写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...
- 认识程序的执行:从高级语言到二进制,以java为例
java 高级编程语言,面向对象*.java是源码文件*.class是字节码文件,一种中间文件. JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的 ...
- Github上Laravel开源排行榜Star数前30名
Github上Laravel开源排行榜前30名,罗列所有 Laravel 开源扩展包,含 Github Star 数量,下载数量和项目简介.默认排序是按Star数量从多到少来排 1.cachethq/ ...
- Codeforces Round #FF (Div. 2) 题解
比赛链接:http://codeforces.com/contest/447 A. DZY Loves Hash time limit per test 1 second memory limit p ...
- [django]django配合前端vue前后端联调,django服务端解决跨域(django-cors-headers)
django内部csrf post提交数据解决 https://www.cnblogs.com/iiiiiher/articles/9164940.html 前端写了个页面,里面$.post发现403 ...
- Response实例
Response部分方法介绍及实例 客户端浏览器每访问一次web服务器的页面都会提交一次请求,与request对象对应的是response对象,该对象可以用来对客户的请求做出响应,向客户端发送数据.输 ...
- 利用Python实现简单的相似图片搜索的教程
大概五年前吧,我那时还在为一家约会网站做开发工作.他们是早期创业公司,但他们也开始拥有了一些稳定用户量.不像其他约会网站,这家公司向来以洁身自好为主要市场形象.它不是一个供你鬼混的网站——是让你能找到 ...