http://twitpic.com/85xuteより
i8086ってあるじゃないですか。アドレスが20ビットあるので、1Mバイトの空間をアクセスできる仕様なんですが、実際にはリニアにはアクセスできずに64Kバイト単位のセグメントを指定する方式ですよね
別にそれはいいんですが
物理アドレスの算出にはセグメントレジスタを16倍Lた値と16ピット長のオフセットを加算Lた値なんで実際には64Kパイト単位のアラインじゃないんです。
私ああいうの気持ち悪いんですよね
「なんだi8086ってこの時代錯誤の漫画は」
「時間が止まってるんだよ。よくある病理だ」
「それを言いたいわけ?」
「そうでもない」
「というと?」
「i8086のメモリは64Kバイトのメモリで分割されている、というのがそもそも迷信だからだ」
「でも、64Kバイトまでしか直接アクセスできないじゃないか」
「その場合の直接という言葉の意味は何?」
「えーと、セグメントレジスタの値を変更せずにってことかな?」
「なぜセグメントレジスタの値を変更しないの?」
「なぜって。そうだな。コードは複雑になって遅くなるからかな」
「単にコードサイズやスピードの問題なら、『アクセスできない』とまで言ったら言い過ぎじゃ無いか」
「ええと」
「実際、i8086用の一部C言語の処理系ではhugeポインタというのがあって、64Kバイトに制約されないでそれ以上のメモリも連続して扱えるぞ」
「じゃあ、制約は無いってこと?」
「そうじゃない。制約はある。hugeポインタも万能じゃない。制約だらけでとても使いにくいぞ」
「あれ? 君が何を言いたいのか分からなくなったぞ」
「だからさ。i8086には制約が存在する。これは事実。しかし、その制約が正しく理解されているとはとても言えない」
「えー」
「たとえばメモリは640MBまでとか、メモリは64Kバイトで分割されているとか、そんな説明がけっこう多いけど全部デタラメ」
「じゃあ、真実はなんだよ」
「i8086のメモリは、実際には16バイト単位で分割されていると考えるべきだね。その方が分かり易い」
「なんでだよ」
「絶対アドレスを指定できるセグメントは16バイト単位でしかアドレスを指定できないんだ」
「オフセット付ければ1バイト単位で指定できるだろ?」
「だから、それはオフセットつまり相対アドレスであって絶対アドレスじゃないんだよ」
「えー」
「たとえば、モトローラの6800の場合、インデックスアドレッシングに付くオフセットはインデックス・レジスタに1バイトで付加される0から255だね。でも、誰も256バイト単位でしかアクセスできない、とは言わない」
「なんだよそれ」
「だからさ。オフセットつまり相対アドレスは起点を変えれば同じ値でも違うアドレスを指し示す。これ当たり前」
「まさか」
「そうさ。i8086でも、セグメントの値を変えれば特定のオフセットが指し示す絶対アドレスがいくらでも変化する。そもそもオフセットとはそういう意味だ」
「1[0]と0[1]は等価ってことだね」
「そうだ。そのことを誰も気持ち悪いとは言わない。相対アドレスとはそういうものだからだ」
「じゃあ、この人は何が気持ち悪いのかな?」
「さあな。知らん」
「知らんって……」
「他人の心など分かるわけ無いだろ」
「じゃあ、君は気持ちが悪いとは思わないの?」
「不便とか効率が悪いとか分かりにくいとか言うのは分かるが、気持ち悪いとまでは思わないな」
「なぜ受け止め方に差があるの?」
「とりあえず、インテルとx86の悪口言っておけば『周囲からそうだよね』って言ってもらえる安心感があるからじゃないか?」
「じゃあ、それほど真剣に考えてないってこと?」
「だろうな。本当にi8086の気持ちになって物事を真剣に考えていれば、こんな安直な解釈では終わらないだろう」