Advertisement

30天自制操作系统Day2

阅读量:
  1. 准备环境notepad++
  2. 指令意思解释
    helloos.nas程序如下:
复制代码
    ; 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, world"
    		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
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

其中:
DB:(data byte)写入一字节数据
DW:(data word)写入两字节数据
RESB:(reserve byte)释放字节
DD:(data double-word)写入四个字节
ORG: 程序的起始内存地址
JMP:相当于goto,跳转指令
MOV: 如 MOV a 1, 即把1赋值给a
INT: INT func,即终端当前程序,跳转至func函数
HLT: 结束程序,cpu待机
CMP: 比较指令,CMP a b,a与b进行比较
JE: 若比较结果相等,JE func,跳转至func函数
ADD: 加法运算,ADD a 1,给a加1

命令解释:
数据大小 [地址]
如MOV BYTE [255] ,123 指令是用“255”号地址保存“123”这个数值

利用make指令执行makefile文件内的命令
makefile文件内容如下:
其中img 、asm、run、install均为命令语句,下一行则为打开指定位置的程序,利用make.exe执行命令,相当于在Day1中输入的分散指令集中至makefile文件中,输入make run指令后,会调用img命令,生成helloos.img,随后把helloos.img复制至fdimage0.bin下,最后打开模拟器,显示hello world。

复制代码
    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
    
    img:
    	../z_tools/make.exe -r helloos.img
    
    asm:
    	../z_tools/make.exe -r ipl.bin
    
    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/iimgtol.com w a:helloos.img
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

运行结果:
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~