本文共 4109 字,大约阅读时间需要 13 分钟。
开发一个,基于底层硬件的
helloworld
小程序.
先下载了一个二进制编辑器软件Bz.exe
,创建一个helloos.img
镜像文件,制作软盘镜像文件(通过这二进制编辑器),实际上C语句被其他程序转化为一系列的低级机器语言指令,这些指令再按照可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来,我们是直接写了这个二进制文件,将此文件写入电脑,可以用来显示helloworld
小程序。步骤如下:
Bz
上编写一个helloos.img
镜像文件toolset
文件夹整个复制到另一个的文件夹下面toolset
文件夹下建立一个新的文件夹gq_helloos
helloos.img
添加至gq_helloos
中toolset
文件中z_new_w
文件夹下的!cons_nt.bat
添加在新文件夹中gq_helloos
中创建一个文件命名为run.bat
,编辑文件内容为:copy helloos.img ..\z_tools\qemu\fdimage0.bin..\z_tools\make.exe -C ../z_tools/qemu
gq_helloos
中创建一个文件命名为install.bat
,编辑文件内容为:..\z_tools\imgtol.com w a: helloos.img
(.bat后缀为批处理文件格式,批处理文件是无格式的文本文件,它包含的是一些命令的代码,在命令提示下输入批处理文件名字或者双击批处理文件都会,按照文件中命令的顺序来执行命令。相当于一个集合了命令集的文件。)
..\z_tools\qemu
中,使用时只要打开命令窗口,等一下!命令窗口怎么打开(黑人问号???),只要双击666之前添加的!cons_nt.bat
就可以打开命令窗口了,然后在命令行窗口中输入"run"指令就可以了。相当于
run.bat
中的内容就是"run"指令,在命令窗口中输入"run"就是调用了run.bat
中的指令,从而开始运行程序
hello,world
接下来使用汇编语言来写这个程序,上一步构建的gq_helloos
文件夹中进行修改
helloos.img
镜像文件(但程序最后的运行还是需要镜像文件,下面会利用汇编文件生成镜像文件的)helloos.nas
,编写内容为:DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 RESB 16 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 368 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
不要看这个代码只有22行,短小精悍,RESB代表省略的字节,省略的全部都是0x00,比如最后的 RESB 1469432 ,就省略了1469432个0x00
asm.bat
,编写内容为: ..\z_tools\nask.exe helloos.nas helloos.img
其命令就是按照汇编文件helloos.nas
生成对应的镜像文件helloos.img
!cons_nt.bat
打开命令行窗口,在命令行中输入"asm’'指令,然后会在文件夹中生成对应的镜像文件helloos.img
,最后在命令行中输入"run"指令,程序就会像上面一样执行,显示helloworld窗口主要是对helloos.nas
文件的改进,使代码变得更可读(说实话我也看不懂,抄就是了)
; hello-os; TAB=4; 以下这段是标准FAT12格式软盘专用的代码 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; 启动区的名称可以是任意字符串(8字节) DW 512 ;规定 每个扇区的大小(必须为512字节) DB 1 ; 规定簇的大小,以扇区为单位(必须为1个扇区) DW 1 ; 规定FAT的起始位置(一般是从第一个位置开始) DB 2 ; FAT的个数(必须为2) DW 224 ; 根目录的大小(一般设置224项) DW 2880 ; 规定磁盘大小(必须2880个扇区大小) DB 0xf0 ; 规定磁盘的种类 DW 9 ; 规定FAT的长度(必须是9个扇区) DW 18 ; 规定一个磁道的扇区个数(必须18个) DW 2 ; 规定磁头数(必须2个) DD 0 ; 不使用分区,必须为0 DD 2880 ; 重新确定磁盘大小为2880个扇区 DB 0,0,0x29 ; 教程也不知道这是什么 DD 0xffffffff ; たぶんボリュームシリアル番号 DB "HELLO-OS " ; 磁盘的名称 DB "FAT12 " ; 磁盘的格式 RESB 18 ; 空出18个字节;程序主体 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd; 信息显示部分 DB 0x0a, 0x0a ;俩次换行 DB "hello, world" DB 0x0a ; 换行 DB 0 RESB 0x1fe-$ ; 自动填写0x00,直到0x001fe DB 0x55, 0xaa; 启动区以外部分输出 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
在里面的"hello, world"也可以换为其他字符串,一样可以显示出来,比如俗的不能再俗的 i love you
对汇编语言的指令说明在注释
忙了一天,多少有点收获,现在我可是精通代码的抄写、能够熟练使用复制粘贴…emm 多少了解了代码的执行过程,了解了一点点汇编语言,搞明白了镜像文件、批处理文件,对CPU处理数据的原理有了一定认识,会使用二进制编辑器,而且今天搜集了很多火影壁纸…帅气的第七班
要知道所有在计算机上的文件、程序实质上都是一堆二进制数,而计算机所执行的所有操作都是这一堆二进制数来控制的,理论上利用二进制编辑器可以编写任意的文件或者软件,所以本文利用二进制编辑器来编写了一个helloos.img
镜像文件。
;:这是个注释命令,相当于C中的注释符//
DB:DB指令是define byte的缩写,意为往文件中直接写入一个字节,当然,也可以结合双引号""来写字符串 RESB:意为省略字节,但省略的字节都是0x00,如RESB 7意为空出7个字节 DW:是define word的缩写,计算机世界中word=16位,即俩个字节,所以DW意为写俩个字节 DD:是define double-word的缩写,意为写四个字节 TAB:TAB=4代表设置缩进4位 $:美元符号,是个变量,代表当前的字节数,利用其可以控制代码中0x00的个数转载地址:http://zowzi.baihongyu.com/