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
浙公网安备 33010602011771号