Explore "Full-Stack" in depth!

情報系の専門学校で、今は機械学習に的を絞って学習中。プログラミングを趣味でやりつつ、IT系のあらゆる知識と技術を身に付けるべく奮闘中。

IA-32 Architectures Developer's Manual 4章まとめ

目次

概要

IA-32 マニュアルを読み始めました。

無料で読めるドキュメントとしては破格の詳しさなので、 システムプログラミングに興味のある人は全員読むべきです。

今回はこのマニュアルのうち4章の内容をベースにしながら、 自身で調べたことをガンガン追記しつつ紹介していこうと思います。

基本データ型

IA-32アーキテクチャ上でデータを表現する時には、

  • バイト(8bit)
  • ワード(16bit)
  • ダブルワード(32bit)
  • クワッドワード(64bit)
  • ダブル・クワッドワード(128bit)

の単位(これを 基本データ型)を使います。
クワッドワードについては、
Intel486プロセッサで導入されました。

過去シリーズと異なり 性能を重視した設計になっているプロセッサで、
ワイヤードロジック(ハードウェア側で命令実行)の導入等が有名です。

ワイヤードロジックと比較される手法に マイクロプログラム方式があります。
これはCPU内部に マイクロコード(ごく小さなコードで複雑な命令実行を可能にする)を実装しておくというものです。

またダブル・クワッドワードはIntel PentiumⅢで実装されたようですね。
Pentiumは1993年ごろに発売されました。

同じくPentium Ⅲで導入されたものに
SSE:Streaming SIMD Extensionsがあります。
Wikipediaの内容を引用します(後にSSEについて触れます)

SSEは、 x86アーキテクチャに8本の128ビットレジスタを新設し、
浮動小数点演算のSIMD処理 を実現したものである。
4個の32ビット単精度浮動小数点データを一本のレジスタに格納し、
同一の命令を一括処理することが出来る。 拡張命令であるため、その機能を使用するためにはSSEに対応したソースコードを作成し、 プログラムをコンパイルする必要がある。

各データ型のアライメント

アライメントとは データの境界を定義する ことを示します。

スタックのアライメントとかいう言葉をよく聞いたことがあると思います。

あるコンピュータが 1ワード=16ビット である場合、
メモリ上のデータにアクセスするためにはアドレスが 4の倍数 になっている必要があります。
データが4オクテット(1バイト==8ビットでない場合もある)ごとに確保出来ない場合、
データ構造パディングという操作を行いデータがワード単位でメモリ上に存在するようにします。

これこそアライメントといえますよね。

コンパイラの実装や、システムプログラミングに スタックのアライメントはよく耳にしますが、

home.a00.itscom.net

こちらのサイトに分かりやすい解説があります。

x86アーキテクチャにおいては、
プログラムの処理能力向上のために(特にスタック等の)データ構造を利用する際にアライメントを合わせる必要があります。

この理由は、

  • アライメントが合っていないメモリにアクセスすると、 プロセッサは余分なメモリアクセスを必要とする

等が挙げられます。

数値のデータ型

バイト・ワード・ダブルワード等の基本データ型の他に、
数値データ型 に対する演算を可能にするための機構が存在します。

整数

まずIA-32アーキテクチャは、符号付き・符号無し整数を定義しています。

基本情報技術者試験レベルの知識がある人はわかると思いますが、

  • 符号なし整数( unsigned integer )
    • 最上位ビットを 符号ビットとしないデータ表現。
    • 例えば8ビットなら 0~255を表現可能
  • 符号付き整数( signed integer)
    • 最上位ビットを 符号ビット とするデータ表現
    • 8ビットなら -128~127 を表現可能

どちらも 256種類の数値を表現可能 なことに違いはありません。

整数がメモリ上に配置される時、

  • ワード整数→ 連続する2バイト
  • ダブルワード整数→ 連続する4バイト
  • クワッドワード整数→ 連続する8バイト

に配置されます。

浮動小数

浮動小数点のデータ型については、
IEEE 754の規格に準拠しています。

  • 単精度… 長さ32ビット、精度24ビット
    • メモリ上では連続する4バイトに格納
  • 倍精度… 長さ64ビット、精度53ビット
    • メモリ上では連続する8バイトに格納
  • 拡張倍精度… 長さ80ビット、精度64ビット
    • メモリ上では連続する10バイトに格納

ポインタ型

ポインタという言葉は私達に馴染み深いですよね。

プログラミングで変数が格納されたアドレスと同じです。

ただしIA-32アーキテクチャ上では変数に限定はされていません。

主に二種類のポインタがあり、

  • nearポインタ… 32ビット長
    • 実効アドレスを指す
    • フラットメモリモデルにおいては全てのメモリを参照するために用いられる
    • セグメント化モデルでも用いられるが、 アクセス対象のセグメントは暗黙的に決まる
    • farポインタ…48ビット長
    • 論理アドレスを指す
    • セグメント化モデルではメモリ参照時に セグメントを明示的に指定

ビットフィールドデータ型

連続するビット・シーケンスのデータ型です。
最大32ビットを格納でき、
またメモリ上にある任意のバイトの任意のビット位置から指定できます。

ストリング・データ型

連続するビット/バイト/ワード/ダブルワードのシーケンスを示します。

  • ビットストリング
    • 任意のバイトの任意のビット位置から指定できる
  • バイトストリング
    • バイト・ワード・ダブルワードを格納できる

パックドSIMD データ型

SIMD演算に使用される 64/128ビットのデータ型です。


総評

IA-32アーキテクチャのデータ型について学びました。
5章は命令セットの紹介に過ぎないので、
次は 6章の記事 をあげると思います。