メモ:「30日でできる!OS自作入門 」2日目


第2章 プログラム本体のアセンブリ

  • レジスタの説明も命令の説明も雰囲気で理解した
entry:
    MOV AX, 0
    MOV SS, AX
    MOV SP, 0x7c00
    MOV DS, AX
    MOV ES, AX
putloop:
    MOV AL, [SI]
    ADD SI, 1
    CMP AL, 1
    JE fin
    MOV AH, 0x0e
    MOV BX, 15
    INT 0x10
    JMP putloop
fin:
    HLT
    JMP fin
msg:
    DB 0x0a, 0x0a
    DB "hello, world"
    DB 0x0a
    DB 0

AX - Accumulator
CX - Counter
DX - Data
BX - Base

SP - Stack Pointer
BP - Base ...
SI - Source Index
DI - Dest Index

AL, AH, EAX の違いはなんとなく分かっていた。

ES - Extra Segment
CS - Code Segment
SS - Stack Segment
DS - Data Segment
FS - Extra2
GS - Extra3

BX, BP, SI, DI は Indexとして使える。なるほど

CMP, JE, INT は雰囲気で理解した

  • community.osdev.info が動いていないことが今分かった(たまたま?)

0x7c00 を決めたのは IBM のおじさんw

lst ファイルは disassembly したものと似たようなもの

付いている Makefile は Windows 用なので、.exe を消したりして動くようにした。

edimg とかは挙動あまり分かっていない。(img 作ってくれるぐらい)

helloos3, helloos4, helloos5 問題なく動いた。

helloos5 の JMP entry を JMP msg にしても qemu 上は何も表示されなかった。

さて明日は 第3章の C のコンパイルできるかなぁ。。gcc / clang あたりでやりたいですが、この調子だと動かなさそう。。