day2 汇编语言学习与Makefile入门

; hello-os
; TAB=4

        ORG        0x7c00            ; このプログラムがどこに読み込まれるのか

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

        JMP        entry
        DB        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バイトあけておく

; プログラム本体

entry:
        MOV        AX,0            ; レジスタ初期化
        MOV        SS,AX
        MOV        SP,0x7c00
        MOV        DS,AX
        MOV        ES,AX

        MOV        SI,msg
putloop:
        MOV        AL,[SI]
        ADD        SI,1            ; SIに1を足す
        CMP        AL,0
        JE        fin
        MOV        AH,0x0e            ; 一文字表示ファンクション
        MOV        BX,15            ; カラーコード
        INT        0x10            ; ビデオBIOS呼び出し
        JMP        putloop
fin:
        HLT                        ; 何かあるまでCPUを停止させる
        JMP        fin                ; 無限ループ

msg:
        DB        0x0a, 0x0a        ; 改行を2つ
        DB        "hello, zero"
        DB        0x0a            ; 改行
        DB        0

        RESB    0x7dfe-$        ; 0x7dfeまでを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

ORG:程序从指定的这个位置开始;

JMP:相当于C的goto;

entry:标签的声明,用于JMP指令的跳转目的地;

MOV:赋值命令,例如MOV AX,0 相当于AX=0,

 

CPU中的寄存器:

AX -- accumulator 累加寄存器
CX -- counter 计数寄存器
DX -- data 数据寄存器
BX -- base 基址寄存器
SP -- stack pointer 栈指针寄存器
BP -- base pointer 基址指针寄存器
SI -- source index 源变址寄存器
DI -- destination index 目的变址寄存器

这些寄存器全部是16位寄存器,因此可以存储16位的二进制数

 

另一方面 CPU 中还有个8个8位寄存器:

AL -- accumulator low 累加寄存器地位
CL -- counter low 计数寄存器地位
DL -- data low 数据寄存器地位
BL -- base low 基址寄存器地位
AH -- accumulator high 累加寄存器高位
CH -- counter high 计数寄存器高位
DH -- data high 数据寄存器高位
BH -- base high 基址寄存器高位

AX寄存器有16位,其中0到7的低8位称为AL,8到15的高8位称为AH,一次类推,适用于CX,DX,BX。

但是BP,SP,SI,Di却没有高低位

 

32位系统的寄存器名字分别是:

EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

虽然我们可以吧EAX作为2个16位的寄存器来使用,但只有低16位用起来方便,如果我们要用高16位的话,就需要用到位移命令,把高16位移动到低16位才能使用。

 

MOV AL,[SI]

括号表示内存

ADD SI,1: 表示SI=SI+1

CMP AL,0

JE fin

如果相等就跳转到结束,JE jump if equal

 

INT: 中断命令,interrupt

HLT: halt 停止,让CPU处于待机状态,并不是完全的停止。

ORG中的0x7c00,不能做更改

0x00007c00-0x00007dff   启动区内容的装载地址

 

在helloos4的文件夹中

asm.bat:

..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst

makeing.bat:

..\z_tools\edimg.exe   imgin:../z_tools/fdimg0at.tek   wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

最后运行run文件

 

在helloos5文件夹中,作者将各种bat文件总汇到了makefile中,cons启动后,输入:make run命令即可

Makefile文件中的内容是:

# デフォルト動作

default :
    ../z_tools/make.exe img

# ファイル生成規則

ipl.bin : ipl.nas Makefile
    ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img : ipl.bin Makefile
    ../z_tools/edimg.exe   imgin:../z_tools/fdimg0at.tek \
        wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

# コマンド

asm :
    ../z_tools/make.exe -r ipl.bin

img :
    ../z_tools/make.exe -r helloos.img

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

install :
    ../z_tools/make.exe img
    ../z_tools/imgtol.com w a: helloos.img

clean :
    -del ipl.bin
    -del ipl.lst

src_only :
    ../z_tools/make.exe clean
    -del helloos.img
View Code
posted @ 2019-12-25 11:09  迷失彼岸  阅读(204)  评论(0)    收藏  举报