2日目

Jmp命令

1日目で

.byte  0xeb, 0x4e

と書いていた箇所は、アセンブラの命令のjmp命令に相当しているようです。

ipl.s

前回まで、helloos.sという名前でアセンブラを書いていましたが、
ファイル名をipl.sに変更しました。下記に変更後のソースを示します。

.code16                                                                                        
# 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
    jmp entry
    .byte 0x90
    .ascii "HELLOIPL"         # ブートセクタの名前(8バイト)
    .word  512                # 1セクタの大きさ
    .byte  0x01               # クラスタの大きさ
    .word  1                  # FATの開始位置(普通は、1セクタ目から)
    .byte  0x02               # FATの個数
    .word  224                # ルートディレクトリ領域の大きさ(224エントリ)
    .word  2880               # このドライブの大きさ
    .byte  0xf0               # メディアのタイプ
    .word  9                  # FAT領域の長さ
    .word  18                 # 1トラックにあるセクタ数
    .word  2                  # ヘッドの数
    .int   0                  # パーティションの個数(未使用なので0)
    .int   2880               # このドライブの大きさをもう一度書く
    .byte  0x00, 0x00, 0x29   # ??
    .int   0xffffffff         # ボリュームシリアル番号
    .ascii "HELLO-OS   "      # ディスクの名前(11バイト)
    .ascii "FAT12   "         # フォーマットの名前(8バイト)
    .skip  18, 0x00           # ??

#プログラムの本体
entry:
    movw $0, %ax
    movw %ax, %ss
    movw $0x7c00, %sp
    movw %ax, %ds
    movw %ax, %es
    movw $msg, %si

putloop:
    movb (%si), %al
    addw $1, %si
    cmpb $0, %al
    je fin
    movb $0x0e , %ah  #1文字表示
    movw $15, %bx     #カラーコード

新しいgasの命令

命令 説明
.code16 16bit用のバイナリを吐く。
mov 代入命令です。オペランドが1バイト(8bit)なら"b"、2バイト(16bit)なら"w"、4バイト(32bit)なら"l"、8バイト(64bit)なら"q"です。
$ラベル ラベルのアドレスを意味する
(レジスタ) レジスタの数値を利用する
cmp 値を比較する。これもb, w, l, qがつくらしい。
je 指定したラベルへ飛ぶ。


※GASではデフォルトではAT&T記法なので、Intel記法のアセンブラ
ソースオペランドとデスティネーションオペランドが逆になっているのに注意。
(例) AT&T:movw $0, %ax → Intel:mov ax, 0

あとはOS自作本通りの説明です。

INT命令

本にあったページです。
http://community.osdev.info/index.php?%28AT%29BIOS

メモリマップ

本にあったページです。
http://community.osdev.info/index.php?%28AT%29memorymap

makefile

今回からmakefileを導入します。下記のようにしました。
make allでエミュレータ起動までやってくれます。

IMG=helloos.img                                                                                           
IPL=ipl.bin

all:
    make ipl
    make img
    make run

img:${IPL}
    cat  ${IPL} > ${IMG}

ipl:ipl.s
    gcc -nostdlib -o ${IPL} ipl.s -Tipl.ls

run:${IMG}
    qemu -fda ${IMG}

clean:
    rm -rf ${IMG} ${IPL}

インストール用のスクリプト

USBへのインストールで書いてた内容をスクリプト化しました。

#!/bin/bash                                                                                    

######################
#インストールスクリプト
#管理者で実行すること
######################

#必要なら下記値を書き換えること
export IMG=helloos.img
export USB_DEV=/dev/sdc1

dd if=${IMG} of=${USB_DEV}

今後の予定

完成したら、知識を整理するという意味でもWikiでも作成しようかと思っています。