セグメントレジスタのメモ。
Mona本読んでて気になった所。
セグメント・・・。
ちと理解が足らない所なのでセグメントレジスタについてまとめておこう。
まず、セグメントレジスタの特徴。
- 16ビット時代の遺産。サイズは16ビット。
- メモリを1Mバイトに拡張するための苦肉の策。
- OS作る人以外はいじる必要なし。
- プロテクトモードでは使用法が異なる?
nasmの場合、segment:offsetの形で書く。
計算方法は、
リニアアドレス = segment * 16 + offset
ブートの場合、0x07C00に飛ぶので、CS:SIは、0x07C0:0x0000となる。
CS | コードセグメント | SI(実行ポインタ)が参照する |
DS | データセグメント | mov等が参照する |
SS | スタックセグメント | push,pop,call,retなどスタック関連の時参照する |
ES | エクストラセグメント | おまけ |
FS,GS | 名前なし? | おまけ2 |
gasについて調べる必要アリ。
詳しくは、はじめて読む486を参照せよ。
実験1
csに0を代入して爆走させてみる
xor %ax, %ax mov %ax, %cs
爆走した!!
超危険技。こうならない事を祈る。
実験2
1文字表示関数でssに1個足してみる。
put: mov %ss, %ax inc %ax mov %ax, %ss
文字化け。
まとめ
爆走させて遊んでみたけど、利用法によっては便利に使えるかも。