码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-19 20:43:02      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

书上上来就直接用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:

技术分享

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

标签:

原文地址:http://www.cnblogs.com/cuichen/p/4296270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!