Day1 从计算机结构到汇编程序入门

书上上来就直接用16进制编辑器来写了第一个有点像操作系统的软件,在屏幕上打印hello world…………

自己输入根本不现实嘛,书上还介绍了一系列如何输入一大堆0的方法,最后作者连猫都牵来了,略感无语,不过我想这大概是作者随性的行文特点吧…………

除此之外,作者准备了几个批处理文件,最上边两个批处理文件的功能就是在当前目录下打开命令行窗口,但为什么需要两个呢?原因就是win9x系列和winnt系列命令行打开方式不同,9x是command,nt是cmd.exe.

run.bat的代码如下:

copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe    -C ../z_tools/qemu

这两行代码的大致功能就是使用位于z_tools/qemu下的qemu虚拟机运行这个映像,话说除了虚拟机运行也没有什么其他的方法了,毕竟现在软盘基本上已经淘汰了,现在好多同学甚至见都没见过…………话说我还是有幸见过一面并亲手拆了它的…………

install.bat的代码如下:

..\z_tools\imgtol.com w a: helloos.img

利用imgtol.com工具将helloos.img映像写到软盘上,当然这个对于我们已经是没有用的东西。

之后作者把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

然而根本看不懂这是什么啊………………

之后的文件夹的内容就变成这样了:

新增了一个asm.bat的批处理:

..\z_tools\nask.exe helloos.nas helloos.img

这个批处理使用作者自己写的nask.exe把helloos.img编译成helloos.img,敬佩之情油然而生啊有木有……

但还是看不懂这些奇怪的东西,于是进一步改写:

; hello-os
; TAB=4

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

        DB        0xeb, 0x4e, 0x90
       DB        "HELLOIPL"        ; ブートセクタの名前を自由に書いてよい(8バイト)
        DW        512                ; 1セクタの大きさ(512にしなければいけない)
        DB        1                ; クラスタの大きさ(1セクタにしなければいけない)
        DW        1                ; FATがどこから始まるか(普通は1セクタ目からにする)
        DB        2                ; FATの個数(2にしなければいけない)
        DW        224                ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
        DW        2880            ; このドライブの大きさ(2880セクタにしなければいけない)
        DB        0xf0            ; メディアのタイプ(0xf0にしなければいけない)
        DW        9                ; FAT領域の長さ(9セクタにしなければいけない)
        DW        18                ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
        DW        2                ; ヘッドの数(2にしなければいけない)
        DD        0                ; パーティションを使ってないのでここは必ず0
       DD        2880            ; このドライブ大きさをもう一度書く
        DB        0,0,0x29        ; よくわからないけどこの値にしておくといいらしい
        DD        0xffffffff        ; たぶんボリュームシリアル番号
        DB        "HELLO-OS   "    ; ディスクの名前(11バイト)
        DB        "FAT12   "        ; フォーマットの名前(8バイト)
        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        ; 改行を2つ
        DB        "hello, world"
       DB        0x0a            ; 改行
        DB        0

       RESB    0x1fe-$            ; 0x001feまでを0x00で埋める命令

        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-os
; TAB=4

      ; 以下这段是标准FAT12格式软盘专用代码

        DB        0xeb, 0x4e, 0x90
       DB        "HELLOIPL"        ; 启动区的名称可以使任意字符串(8字节,不够需用空格补上)
        DW        512                ; 每个扇区(sector)的大小(必须为512字节)
        DB        1                ; 簇(cluster)的大小(必须为1个扇区)
        DW        1                ; FAT的起始位置(一般从第一个扇区开始)
        DB        2                ; FAT的个数(必须为2)
        DW        224                ; 根目录的大小(一般设成224项)
        DW        2880            ; 该磁盘的大小(必须是2880扇区)
        DB        0xf0            ; 磁盘的种类(必须是0xf0)
        DW        9                ; FAT的长度(必须是9扇区)
        DW        18                ; 1个磁道(track)有几个扇区(必须是18)
        DW        2                ; 磁头数(必须是2)
        DD        0                ; 不使用分区,必须是0
       DD        2880            ; 重写一次磁盘大小
        DB        0,0,0x29        ; 意义不明,固定
        DD        0xffffffff        ; (可能是)卷标号码
        DB        "HELLO-OS   "    ; 磁盘的名称(11字节)
        DB        "FAT12   "        ; 磁盘格式名称(8字节)
        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        ; 2个换行
         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

哦,一直忘了说DB指令了……define byte 的简写,写入一个字节的指令,另外上面的DW和DD就是 define word和double word了,分别是2个和4个字节。

那个$符号在这里表示这一行现在的字节数,这样我们改上面那个hello world也方便。

这里作者还简单的介绍了一下几个基本概念,我就挑重点的说一下吧:

启动区是软盘的第一个扇区,512字节,最后两个字节必须是0x55AA.

IPL是启动程序加载器。

第一天就结束了,看看成果,这里我自恋的将hello world改为了cui chen:

时间: 2024-10-12 20:10:32

Day1 从计算机结构到汇编程序入门的相关文章

Python疗程一day1:Python简介和入门

python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pythonde 设计哲学是:“优雅”.“明确”.“简单” 二.python由来  1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.之所以选中Python作为程序的名字,是因为他是BBC电视剧——蒙提·派森的飞行马戏团(Monty Py

自制操作系统

从计算机结构到汇编程序入门 汇编语言学习与Makefile入门

Golang 入门 : 结构体(struct)

Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和一个类型. 结构体的目的就是把数据聚集在一起,以便能够更加便捷地操作这些数据.结构体的概念在 C 语言里很常见,被称为 struct.Golang 中的结构体也是 struct.Go 语言中没有类的概念,因此在 Go 中结构体有着更为重要的地位.结构体是复合类型(composite types),当

小程序入门(1)项目结构篇。

项目结构 小程序入门(0)项目创建篇 , 下载开发工具并创建项目. 小程序入门(2)浅析篇 ,了解wxml与wxss的配合使用 小程序进阶(1)豆瓣电影,看文档,复制文档代码基础布局也可以轻松搭建. 在编辑中找到加号!创建button目录. 添加一个外层文件button, 在四个内层文件 js,json , wxml , wxss . 名字与外层文件相同. 创建外层文件,分别在创建内层 js,json,wxml,wxss.这样就生成了一个伪页面,说它是伪页面到后面进行分析. . js:javas

读书笔记--30天自制操作系统 目录

1.着手开发前 开发步骤 1.编写源代码 2.用编译器编译 3.生成软盘映像 4.将映像写入磁盘,做成启动盘. 2.计算机结构到汇编程序入门3.汇编语言学习与Makefile入门4.进入32位模式并导入C语言5.C语言与画面显示的练习6.结构体.文字显示与GDT/IDT初始化7.分割编译与中断处理8.FIFO与鼠标控制9.鼠标控制与32位模式切换10.内存管理11.叠加处理12.制作窗口13.定时器114.定时器215.高分辨率及键盘输入16.多任务117.多任务218.命令行窗口19.dir命

江苏专转本计算机终极笔记

转本计算机核心考点 "计算机核心考点"是学长准备考试几个月以来构建的笔记系统 内容涵盖了江苏转本计算机考试十个章节的几百个知识点 同时也是近十年来容易考到的重点 建议计算机基础较差的同学 多多留意并掌握 江苏专转本计算机大纲 红色字体:选择或判断中出现过 蓝色字体:重要的公式 加下划线:填空中出现过 目录 一.信息技术概述 一.信息技术概述 信息技术概述大纲 1.1 信息技术基本概念 信息处理:收集加工.传递存储.控制显示 基本信息技术: 扩展感觉器官功能--感测与识别技术 扩展神经网

第7讲——函数初步

我们知道,C++自带了一个包含函数的大型库(标准ANSI库加上多个C++类),但这并不能满足我们的需求,我们需要编写自己的函数.但我们在编写函数时为了提高编程效率,可更深入地学习STL和BOOST C++提供的功能. 我们先学习一下库函数,它是已经定义和编译好的函数,同时可以使用标准库头文件提供其原型,因此只需正确地调用这种函数即可.例如,标准C库中有一个strlen()函数,相关的标准头文件cstring包含了strlen()和其他一些与字符串相关的函数的原型.这些预备工作使程序员能够在程序中

ARM指令教程

ARM指令教程 ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值. l         ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,为0,为负…) CMP R0,R1 BNE NoMatch 比如上一句,BN

卷积神经网络Lenet-5实现-深入浅出

卷积神经网络算法是n年前就有的算法,只是近年来因为深度学习相关算法为多层网络的训练提供了新方法,然后现在电脑的计算能力已非当年的那种计算水平,同时现在的训练数据很多,于是神经网络的相关算法又重新火了起来,因此卷积神经网络就又活了起来. 在开始前,我们需要明确的是网上讲的卷积神经网络的相关教程一般指的是神经网络的前向传导过程,反向传播都是用梯度下降法进行训练,大部分深度学习库,都已经把反向求导的功能给封装好了,如果想要深入学习反向求导,就需要自己慢慢学了. 因为卷积神经网络的经典模型是:Lenet