アットウィキロゴ

Chapter 2

■メモ

  • ORG(origin 開始点): この機械語が実行時にPCのメモリのどこに読み込まれることになるのかをnaskに教えてあげるための命令。この命令を書くと、$の意味が変わる。出力ファイルの何バイト目であるかではなく、読み込まれる予定のメモリの番地になる。(このプログラムはここから始まるよー、ちなみにここまメモリ○○番地(ここでは0x7c00)に読み込まれる予定だよって意味)
    •  0x00007c00 - 0x00007dff : ブートセクタが読み込まれるアドレス。今回のORGの値はここの数字を使った。 

  • JMP(jump): C言語でいうgoto文。
  • entry(入り口): ラベルの宣言。JMP命令の飛び先の指定などに使う。
  • MOV(move 移動): 代入。値は移動せず(空っぽにはならない)、そのままの値。
  • MOV AX,0  AX=0
  • MOV SS,AX SS=AX  という代入文。
  • entry = 0x7c50
  • アセンブラでは、ラベルはすべてただの数字
  • MOVは代入だから、SI = msg msgは0x7c74だから、SIには0x7c74が代入されることになる
  • CMP AL,0 ALを0と比較しなさい
  • JE命令: 比較の結果が等しければジャンプしなさい
  • INT命令: interrupt ソフトウェアの割り込み命令、BIOSの関数を呼ぶために使う命令。
  • HLT命令 (halt): CPUを停止させる命令。待機状態にする。 この命令は書いても書かなくても問題ない。
  • msgに書いてあるデータが1文字ずつ表示されて、データが0になったらHLTの無限ループになる。

代表的なレジスタ

  • CPUにはレジスタという記憶回路がある。機械語における変数のこと。

16ビットのレジスタ

※機械語におけるレジスタ番号の順 (この順番ほんと?)

AX・・・アキュムレータ
CX・・・カウンタ
DX・・・データ
BX・・・ベース

SP・・・スタックポイント
BP・・・ベースポインタ
SI・・・ソースインデックス
DI・・・デスティネーションインデックス

  • これらはすべて16ビットレジスタで、だから16桁の2進数を記憶できる。
  • これら8つのどのレジスタを使ってもたいていは同じ計算ができるが、AXを使うとプログラムを簡潔に書ける。
    • ADD CX,0x1234  は  81 C1 34 12  という4バイトの命令
    • ADD AX,0x1234  は  05 34 12   という3バイトの命令
  • ○XのX、たぶんexdendの意味。
  • 8個のレジスタおを全部あわせても16バイトにしかならない。つまりレジスタを全部使っても、CPUはたったの16バイトしか記憶できない。
  •  CPUには8ビットのレジスタも8個ある

8ビットのレジスタ

AL・・・アキュムレータロウ(low)
CL・・・カウンタロウ
DL・・・データロウ
BL・・・ベースロウ
AH・・・アキュムレータハイ(high)
CH・・・カウンタハイ
DH・・・データハイ
BH・・・ベースハイ

  •  AXレジスタの16ビットのうち、下の位のビット0~ビット7の8ビットの部分をALという
  • 上の位のビット8~ビット15、残りの8ビットの部分をAHという。
  • BP、SP、SI、DIはLとHに分けられない。どうしても結果が必要なときは、MOV、AX、SIとかやって、その上でALとAHを使ってくれ、というのがインテルの設計者の考え。

32ビットのレジスタ

EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI

※Eはextendの意味

  • 32ビットのうちの下の16ビットがAX 
  • 上の16ビットは、なんの名前もレジスタ番号もない
  • 簡単に使えるのは下のほうだけ
  • 上の16ビットを使いたい場合は、16ビットをずらす命令を使って、上の16ビットを下へおろしてこないといけない
  • 32ビットになっても32バイトしか記憶できない

セグメントレジスタ

ES・・・extra segment
CS・・・code segment
SS・・・stack segment
DS・・・deta segment
FS・・・本名なし(おまけセグメントパート2)
GS・・・本名なし(おまけセグメントパート3)

  •  セグメントレジスタをフルに使った場合、44バイト記憶できる

MOV AL,[SI] の説明 

  • CPUが機械語を実行するときには、必ずメモリからプログラムを1命令ずつ読み出して、順番に実行している
  • レジスタ 計算できる ⇔ メモリ たくさんあっていっぱいしまっておける
  • MOV命令は、転送先や転送元にレジスタや定数だけでなく、メモリを指定することもできる。そのときに [ ] を使う
  • MOV BYTE  [678] , 123 ・・・ これは団地の678番地に、123を覚えてもらう命令。指定したメモリだけが対象になる。
  • MOV WORD [678] , 123・・・ めもり団地の678番地と、お隣の678番地の記憶素子が反応する。指定したお隣の番地も対象になる。
  • DWORD・・・ 指定したお隣とその隣とさらにもう1つとなりも対象になる。(4バイトだから)
  • メモリ番地の指定方法は、定数だけでなくレジスタ(限られている BX、BP、SI、DIのみ)を使うこともできる。 例: BYTE [SI]、WORD [BX] etc.
  • メモリのSI番地の1バイトの内容をALに読み込む → MOV AL,BYTE [SI]
    • MOV命令は、ビット数が同じもの同士しか代入できない規則があり、つまりALに代入することは、BYTE以外はありえないので、MOV AL, [SI] という表現になる
    • 「メモリのSI番地の1バイトの内容をALに読み込め」っという意味
  • アセンブラでメモリを指定するときは、"データの大きさ [番地]"

Makefile導入

  • かなりかしこいバッチファイルのようなもの
  • # → コメントマーク
  • 以下のコマンドの意味は、「ipl.binというファイルをもし作りたくなったら、まうipl.nasというファイルとMakefileというファイルが揃っていることを確認しなさい」

   

  • ¥ → 1行に書ききれなくて、次の行にまたがって書いたよって意味
  • Makefileを動くようにするには、make.exeを呼び出す必要がある。コンソールから簡単に呼び出せるように、make.batを準備する。
  1. !cons でコンソールを開く
  2. 「make -r ipl.bin」を入力
  3. make.exe が起動
  4. Makefile を読み込む
  5. ipl.bin の作り方が書いてあるので、その1行が実行される
  6. ipl.bin ができあがる
  • Step2で「make -r helloos.img」 と入力すると、ipl.binがまだ存在しないので、ipl.binを作ってその後にhelloos.imgを作ってくれる
  • もう一度「make -r helloos.img」 を入力すると、「helloos.img' is up to date.」というメッセージが出て何もしない。

 

 ■わからないこと

  •  LとHに分ける必要があるときってどんなとき?
  •  make.batの中の、「..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9」意味

 

  • レジスタ
    • CPUが演算などをおこなうためにメモリから値を読みこむ命令実行への最終的な記録装置

 

最終更新:2013年02月04日 11:43