搭建直接通过CPU执行汇编语言的环境
搭建直接通过CPU执行汇编语言环境
我们通过编译写好的汇编语言代码可以生成.bin的机器语言二进制代码。但是这个.bin程序我们该如何运行呢?
这里其实有两个办法:
1: 将其作为一个Windows/linux也就是操作系统的可执行程序来运行,这个nasm是可以做到的,很多工具也可以做到,把一个汇编程序编译链接成一个.exe来处理。
2: 直接通过CPU来使用。因为.bin文件是机器码,肯定是可以直接让CPU来使用的。操作系统也是一个需要在处理器上运行的软件,只不过比 起一般的程序而言,体积更为庞大,功能更为复杂而已。如果我们能绕过它,或者代替它,让计算机一开机的时候直接执行我们自己的程序, 岂不更简单?而且很酷,不用操作系统,自己直接操作CPU。
采用第一种比较简单,这里就不详述了。
搭建环境原理:
前面我们讲述了8086的启动操作:
计算机的启动过程(8086) - Sna1lGo - 博客园 (cnblogs.com)
在bios调用完之后cs:ip会变成物理地址0x07C00来加载主引导扇区的代码,我们可以直接通过硬盘启动,然后把硬盘的主引导扇区的代码变成我们自己的代码。这多帅,直接操作CPU,避开操作系统。
但是我们还需要有调试功能才行,因为如果不能调试,那么CPU就直接顺着代码走就完了,我们啥也看不到,所以我们需要一个带有调试功能的虚拟机。正好有一个非常适合我们,叫做 bochs:bochs: The Open Source IA-32 Emulation Project (Home Page) (sourceforge.io)
预备知识
虚拟硬盘简介:
我们把我们的代码写到硬盘里,然后虚拟机读取我们的硬盘就行了。但是由于我们得往硬盘里写东西,所以需要提前了解一下硬盘。
虚拟硬盘并不是真实的硬盘,而是用文件来模拟生成的一个硬盘。
虚拟硬盘有很多这里介绍三个:
VMDK | VMWare虚拟机 |
---|---|
VDI | VirtualBox虚拟机 |
VHD | Virtual-PC/Hyper-V虚拟机 |
其中VHD比较简单,所以这里我们就采用VHD虚拟硬盘。
VHD也可以分为固定尺寸和动态尺寸,其中固定尺寸更简单,所以采用VHD的固定尺寸硬盘。
在VHD 规范里,每个扇区是512 字节。VHD文件一开始的512 字节,就对应着物理硬盘的0 面0 道1 扇区。然后,VHD 文件的第二个512 字节,对应着0 面0 道2 扇区,后面的以此类推。再往后,因为硬盘的访问是按柱面进行的,所以,下一个数据块对应的是1 面0 道1 扇区,就这样一 直往后排列,当把第一个柱面全部对应完后,再从第二个柱面开始对应。磁盘转圈比移动快,所以最后才移动磁道。
固定尺寸的VHD 虚拟硬盘 是一个具有“.vhd”扩展名的文件,它仅包括两个部分,前面是数据区,用来模拟实际的硬盘空间,最后面跟着一个512 字节的结尾
文件尾的内容是以一个字符串“conectix”开始的。这个标志用来告诉试图打开它的虚拟机,这的确是一个合法的VHD 文件。该标志称为VHD 创建者标识,就是说,该公司(conectix)创建了VHD 文 件格式的最初标准:
从这个标志字符串开始,后面的数据包含了诸如文件的创建日期、VHD 的 版本、创建该文件的应用程序名称和版本、创建该文件的应用程序所属 的操作系统、该虚拟硬盘的参数(磁头数、每面磁道数、每磁道扇区 数)、VHD 类型(固定尺寸还是动态增长)、虚拟硬盘容量等。
磁盘的访问逻辑:
传统的访问模式就是:CHS,通过柱面磁道磁头,也就是前面的0 面0 道1 扇区这种类似的格式,但是这个不太方便。
然后就有了LBA(Logical Block Address)就是把所有的扇区进行一个逻辑编号,从0开始到最后一个扇区进行编号,然后单位为块(block)其实就是扇区,只不过扇区看着确实是一块一块的:
LBA和CHS的对应方式:
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
移动方式稍微不一样点,先移动扇区再磁头最后再更改柱面。因为更改柱面磁头需要移动。 也就是以柱面为单位来读取的意思。
LBA = 磁道*磁头 *每个磁道的扇区数+ 磁头 * 每个磁道的扇区数 + 扇区位置-1
比如这里的: 1面0道2扇区 == 0* 2*17 + 1 *17 +2 -1 ==18
0面1道2扇区 == 1*2 *17 +2 -1 == 35
需要工具:
安装bochs:(在这里选择自己的需要的版本)
Bochs x86 PC emulator - Browse /bochs/2.7 at SourceForge.net
安装 VirtualBox:
Downloads – Oracle VM VirtualBox
下载李忠老师的软件包:
http://www.lizhongc.com/myfiles/download.php?id=201
下载二进制查看软件:
Download HexView 2.0 (softpedia.com)
搭建环境
创建一个固定尺寸的VHD虚拟硬盘,然后将其安装到Bochs虚拟机上。
第一步创建一个虚拟硬盘:
创建虚拟硬盘:
1:打开Virtual Box,单击管理—>虚拟介质管理器,就会得到这个界面:
2:点击创建,选择VHD虚拟硬盘:
3:选择固定大小:
4:自己选择硬盘位置和大小(我这里拿来学习所以不需要太大)
5:查看结果
配置bochs环境
1:选中配置:
2:关闭软盘:(软盘基本上绝迹了)
3:选中ATA channel0:(这个就默认值不改就好)
4:选中ATA channel0的子目录 First HD/CD on channel0
然后修改,其中Path开头那个是前面创建的虚拟硬盘。
然后剩下的信息需要查看虚拟磁盘的信息才可以,这里要用到前面李忠老师的资源包里的一个软件:
叫做fixvhdwr.exe,用它来打开我们前面创建的虚拟硬盘
然后根据里面的信息来填充到前面:
Cylinders为柱面,Heads为磁头,Sectors per track为每个磁道有多少扇区。
5:修改计算机的启动顺序:
改成第一个用磁盘,第二个用光盘。
编写程序放到主引导扇区,让计算机在启动后执行:
编译程序:
首先先采用汇编语言来简单编写一个程序:
mov ax,0x30
mov dx,0xc0
add ax,dx
然后将其编译成.bin二进制文件:
不知道这一步怎么处理的可以查看我的一篇博客:
搭建一键化编译汇编语言的环境 - Sna1lGo - 博客园 (cnblogs.com)
然后采用前面下载的二进制查看文件HexView来打开我们的.bin文件:
可以看到我们这个只有8个字节的内容,但是扇区是以512个字节为单位的,所以我们必须填充成512个字节才行。而且主引导扇区的结尾必须是16进制的55和AA不然就是无效的。
所以我们还得修改一下汇编代码:
mov ax,0x30
mov dx,0xc0
add ax,dx
times 502 db 0x0
db 0x55
db 0xAA
这里的times 502 db 0x0 相当于填充了502个字节的内容且为0。
然后最后结尾为0x55和0xAA。
来查看一下编译后的结果:
一共是512个字节(0x200),且结尾为0x55和0xAA。
将程序写入到虚拟硬盘:
这里需要用到李忠老师提供的软件包的一个软件:fixvhdwr.exe
这个只能写入固定硬盘的内容:
选中我们刚刚的编译好的二进制.bin文件。
然后选择LBA,前面我们了解了LBA的知识所以第一个扇区0面0道1扇区就等于 LBA的0,这里就选0然后选择写入就好了:
然后采用二进制查看工具,查看我们写入了的VHD磁盘是否成功:
前0x200个字节完全对应,所以是成功了。
搭建直接通过CPU执行汇编语言的环境的更多相关文章
- windows汇编语言开发环境搭建
1.下载软件mash32 http://www.masm32.com/download/masm32v11r.zip 此软件包含对汇编文件的编译和运行,下载后直接运行并解压即可 2.配置环境变量 在系 ...
- 通过搭建一个精简的C语言开发环境了解一个C程序的执行过程
一.如何搭建一个精简的C语言开发环境 准备:下载TC2.0,并解压,比如说“d:\tc2.0\tc”目录 1.在C盘建立一个目录minic c:\ md minic 2.从解压的目录中将以下文件拷贝到 ...
- 让你少走弯路的搭建树莓派的Net与NodeJS运行环境
树莓派是当前最火的嵌入计算平台没有之一,树莓派可以给我们无数的想象,树莓派的高性能.低功耗.低成本.可扩展性(最新的树莓派原生支持WIFI和蓝牙,这功能太赞了)深受大家的喜爱.虽然树莓派到目前为止 ...
- 搭建Hadoop2.6.0+Eclipse开发调试环境
上一篇在win7虚拟机下搭建了hadoop2.6.0伪分布式环境.为了开发调试方便,本文介绍在eclipse下搭建开发环境,连接和提交任务到hadoop集群. 1. 环境 Eclipse版本Luna ...
- 研究实验1_搭建一个精简的C语言开发环境(包含部分经典的前言)
综合研究: 在这部分内容中,将启示我们如何进行独立研究和深度思考(一定要注意这一点,相应的调整自己的学习思想).同时使我们: (1)认识到汇编语言对于深入理解其他领域知识的 ...
- 使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境
做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...
- 搭建PhoneCat项目的开发与测试环境
AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 获取源代码 PhoneCa ...
- windows下搭建node.js及npm的工作环境
近期在研究数据可视化D3框架,决定在windows下搭建一个nodejs及npm的工作环境,在网上查了n篇文章,别管是编译源代码安装也好.还是使用node.msi格式安装包也好,总是有问题.终于,功夫 ...
- Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境
原文 Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境 很多人喜欢用linux搭建php网页语言运行环境,但由于linux高度自定义化,经常需要root运行命令,略显高端,相对应的微软 ...
随机推荐
- Roslyn 编译器Api妙用:动态生成类并实现接口
在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...
- react之react Hooks
函数组件,没有 class 组件中的 componentDidMount.componentDidUpdate 等生命周期方法,也没有 State,但这些可以通过 React Hook 实现. Rea ...
- spring中使用@value注入static静态变量
@Value("${meeting.private_key}")public static String PRIVATE_KEY;发现没有数据,null 分析 Spring是不能直 ...
- 快来使用Portainer让测试环境搭建飞起来吧
Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台操作.Swarm集群和服 ...
- 测试平台系列(85) 把redis运用到实战中
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...
- UOJ #76 -【UR #6】懒癌(思维题)
UOJ 题面传送门 神仙题. orz czx,czxyyds 首先没有懒癌的狗肯定不会被枪毙,证明显然. 接下来考虑怎样计算一种局面的答案,假设 \(dp_S\) 表示对于有且仅有 \(S\) 中的狗 ...
- Atcoder Typical DP Contest S - マス目(状压 dp+剪枝)
洛谷题面传送门 介绍一个不太主流的.非常暴力的做法( 首先注意到 \(n\) 非常小,\(m\) 比较大,因此显然以列为阶段,对行的状态进行状压.因此我们可以非常自然地想到一个非常 trivial 的 ...
- DIA技术及其软件工具介绍
前言 关于蛋白质组学,你是不是已经听了太多公司的宣讲,介绍了一大堆的技术名词,反而越听越懵懂,脑袋一团乱麻?就和传话游戏一样,当我们接收了多手信息以后,得到的信息就越不准确.那么,何不自己看一看第一手 ...
- 2.MaxSubArray-Leetcode
题目:最大连续子序列和 思路:动态规划 状态转移方程 f[j]=max{f[j-1]+s[j],s[j]}, 其中1<=j<=n target = max{f[j]}, 其中1<=j ...
- centos 7的命令变化
1.service -> systemctl命令 2.ifconfig -> ip 命令 3.netstat -> ss命令 4.route -> ip route命令 5.t ...