28ー33日目 - OS自作入門2日目の終了の日 2016/5/17, 19-23

くぅ~疲れましたw (納期的な意味で)これにて完結です!

実は、MonaOSの記事を見てOSを作りたくなったのが始まりでした

本当はWEB開発者なので低レイヤの経験ないのですが←

(OS自作入門の)ご厚意を無駄にするわけには行かないので挑んでみた所存ですw

以下、オペコード達のみんなへのメッセージをどぞ

RESB「みんな、見てくれてありがとう ちょっと腹黒なところも見えちゃったけど・・・気にしないでね!」

DB「いやーありがと! 私のかわいさは二十分に伝わったかな?」

MOV「インテル® 64 および IA-32 アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル を見てくれたのは嬉しいけどちょっと恥ずかしいわね・・・」

JMP「見てくれてありがとな! 正直、JMPの実装マジでめんどくせえ!」

HLT「・・・ありがと」ファサ

では、

RESB、DB、MOV、JMP、HLT、俺「皆さんありがとうございました!」

RESB、DB、MOV、JMP、HLT「って、なんで俺くんが!?

改めまして、ありがとうございました!」

本当の本当に終わり

1ヶ月過ぎたけどまだやります

激寒ですけどなんとなくやってみました。とりあえず2日目のアセンブラまでopennaskで表現できたので、ソースコードとその解説をば…

以下にオペコードとその結果出力される機械語を併記しています。
そうです、opennask(nask)を使うと、アセンブラを書いたらその結果機械語を出してくれるのです!超便利!

以下の用語は調べておいたほうがよいでしょう。

オペコードをニーモニックに落としていく作業には以下のリンクが参考になりました。

主なオペコードたち

  • DB/DW/DD:これらが一番簡単な命令で、それぞれデータをByte/Word/Dwordサイズで格納します
    DB - 8bit、つまり1Byte格納します
    DW - 16bit、つまり2Byte格納します、これをWORDと呼びます。Windowsプログラミングすると出てくるあれです。
    DD - 32bit、つまり4Byte格納します、これをDWORDと呼びます。Windowsプログラミングすると出てくるあれです。
  • RESB:指定された回数分0x00で埋めます。普通はTIMES命令で書くらしい。
  • JMP:ニーモニックをおいて、その後オフセット(対象までの距離)と呼ばれるバイナリを置いてやるとJumpできる。
  • MOV:レジスタ、メモリ、即値、オフセットのいずれかを指定するとデータを相互にコピーできる。
  • その他のオペコードたちについては右のリンクを参考にするといいです:Tips IA32(x86)汎用命令一覧
; hello-os
; TAB=4

		ORG		0x7c00			; ORGはバイナリには現れない

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

		JMP		entry			; eb4e
								; 上記 0x4e(78d, 4e自身から見て次のentryまで78byteある)
		DB		0x90			; 90
		DB		"HELLOIPL"		; 48454c4c4f49504c
		DW		512				; 0002
		DB		1				; 01
		DW		1				; 0100
		DB		2				; 02
		DW		224				; e000
		DW		2880			; 400b
		DB		0xf0			; f0
		DW		9				; 0900
		DW		18				; 1200
		DW		2				; 0200
		DD		0				; 00000000
		DD		2880			; 400b0000
		DB		0,0,0x29		; 000029
		DD		0xffffffff		; ffffffff
		DB		"HELLO-OS   "	; 48454c4c4f2d4f53202020
		DB		"FAT12   "		; 4641543132202020
		RESB		18			; 000000000000000000000000000000000000

; プログラム本体

entry:
		MOV		AX,0			; b80000
		MOV		SS,AX			; 8ed0
		MOV		SP,0x7c00		; bc007c
		MOV		DS,AX			; 8ed8
		MOV		ES,AX			; 8ec0

		MOV		SI,msg			; be747c
putloop:
		MOV		AL,[SI]			; 8a04
		ADD		SI,1			; 83c601
		CMP		AL,0			; 3c00
		JE		fin				; 7409
		MOV		AH,0x0e			; b40e
		MOV		BX,15			; bb0f00
		INT		0x10			; cd10
		JMP		putloop			; ebee
fin:
		HLT						; f4
		JMP		fin				; ebfd

msg:
		DB		0x0a, 0x0a		; 0a0a
		DB		"hello, world"	; 68656c6c6f2c20776f726c64
		DB		0x0a			; 0a
		DB		0				; 00
		RESB	0x7dfe-$		; 0x7dfeまで0x00
		DB		0x55, 0xaa		; 55aa

; 後はまあいいですよね…

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

アセンブラを見て、なぜこの機械語が出るかわからなければ右のリンクを参考にするとだいたい書いてあります。:Tips IA32(x86)汎用命令一覧

OS自作入門の内容自体は前回と代わり映えしないので、省略します。次回に期待。