読者です 読者をやめる 読者になる 読者になる

OSなしでHelloWorld

この記事は#一人GWハッカソン 5/2の記事です

本日のテーマはOSなしでHelloWorldをするです

最初はOSを作ろうと思っていましたが一日では無理でした。

10:00~12:00 環境構築

Windowsで環境を構築しようとしたけど上手くいかない… 仕方なくVirtualBoxの上のLinuxを使用する

OSはXubuntu16.04、アセンブラはnasm、仮想マシンにはqemuvirtualboxを使用

12:00~13:00 初めてのプログラム

 [BITS 16] 
ORG 0x7C00
BOOT: 
CLI
HLT 
TIMES 510 - ($ - $$) DB 0
DW 0xAA55

起動した後にブートセクタがメモリの0x7C00に読み込まれるらしいのでORGで0x7C00をセット(GASではORGは使えないみたいですね)
CLIで割り込み禁止、HLTでプログラム終了
最後に位置合わせに0x00を出力しブートセクタ終端の0xAA55
C言語でいう

#include ‹stdio.h›
int main(void){
   return 0;
}

みたいなプログラムらしい。

13:00~14:00 いろいろ

スタックとかセグメントとか

14:00~15:00 INT10

画面入出力とかディスクの読み書きとかするためにはBIOSが提供している機能を使う
画面入出力をするためにはINT 0x10を使う。

INT0x10を使って文字を出力するためには
AHに0x0E
ALに文字のASCIIコード
BHにビデオページ番号
(よくわからないけど0x00で良いらしい)
BLに色を指定

 [BITS 16] 
ORG 0x7C00
BOOT: 
CLI
MOV AH, 0x0E
MOV AL, 0x41 ;'A'
MOV BH, 0x00
MOV BL, 0x07 ;グレー
INT 0x10
HLT 
TIMES 510 - ($ - $$) DB 0
DW 0xAA55

色が変わらないと思ったらビデオモードというのを変えないといけないらしい
グラフィックモードを指定するためにはAXに0x4f02を入れてBXにビデオモードを入れる ビデオモードは VESA BIOS Extensions - Wikipedia で解説されている

 [BITS 16] 
ORG 0x7C00
BOOT: 
CLI
MOV AX, 0x4f02
MOV BX, 0x0102 ;800x600 16色モード
INT 0x10

MOV AH, 0x0E
MOV AL, 0x41 ;'A'
MOV BH, 0x00
MOV BL, 0x0A ;ライトグリーン
INT 0x10
HLT 
TIMES 510 - ($ - $$) DB 0
DW 0xAA55

AHに0x13を入れてINT 0x10すると文字列が表示できるらしいです f:id:akkkix:20170503100750j:plain
なんかちょっと感動

15:00~16:00 寝

昼寝

16:00~ ゚Ω\ζ°)チーン

ディスクの読み書きにハマる
解決方法が分からず終

反省とか

またいつか挑戦したい
こんな感じであと5日浅く広く色々やれればと思う
INT0x10しただけだしハッカソンじゃなくね!?

参考:

http://softwaretechnique.jp/OS_Development/scratchbuild.html

https://en.wikipedia.org/wiki/INT_10H