アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » アンティーク・アセンブラ~Antique Assembler » 第2回 メモリに始まりメモリに終わる

アンティーク・アセンブラ~Antique Assembler

第2回 メモリに始まりメモリに終わる

一般的な CPU アーキテクチャでは,演算や比較といったデータの加工は,レジスタに読み込んだデータに対して実施するのが通例です。その一方で加工対象となるデータは,プログラム作成時には定まっておらず,通常はメモリ上に格納されています。

そのためアセンブラプログラムの多くは,メモリ/レジスタの間でのデータ転送命令によって占められています。

今回は,メモリアクセスの基本となるデータ転送命令について説明します。

アドレッシング

アセンブラでは,処理対象となるものを特定するための形式のことを 「アドレッシングモード」(addressing mode),あるいは単に「アドレッシング」と呼びます。

冒頭で「(メモリ間との)データ転送について説明する」と述べた上で「アドレス」(address)という言葉が含まれていることから,「アドレッシングはメモリを指定するもの」といった誤解を招くかもしれませんが,先述したように「アドレッシング」とは「処理対象となるものを特定するための形式」を指すものですので注意してください。

各CPUアーキテクチャごとにさまざまな種類のアドレッシングが提供されていますが,概ね以下に述べるような分類が可能です。

ここで述べる分類は筆者独自の分類であり,CPU アーキテクチャによっては異なる分類/呼称を用いている場合もありますので注意してください。

レジスタ指定/値指定

処理対象として,レジスタ自身(あるいはレジスタが保持している値)を指定するのか,あるいは値そのものを指定するかで,アドレッシングは大きく2種類に分類できます。

Intel 80x86アーキテクチャでレジスタを指定する場合,"%" に続けてレジスタ名を記述します。

32ビットIntel 80x86アーキテクチャでは,32 ビット幅の値を扱うことができる汎用レジスタとして,EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESPの8つのレジスタが利用可能です。

ただし,汎用レジスタと銘打ってはいるものの,歴史的経緯/アーキテクチャ設計上の理由から,特定用途での使用を前提としているレジスタがあります。上記のレジスタで言うなら,EBPおよびESPはスタック管理(詳細は第5回以降で説明予定)専用と考えた方が良いでしょう。

値そのものが指定される場合,その値を「即値」(immediate value)と呼びます。Intel 80x86アーキテクチャでは,"$" を冒頭に記述することで即値記述であることを明示します。

リスト1 レジスタ指定/値指定

    .text
    .align  4

    .global entry_point
entry_point:
    int3        # プログラム実行の一時停止

    # 即値 ⇒ レジスタ eax
    movl    $0x12345678, %eax

    # レジスタ eax ⇒ レジスタ ebx
    movl    %eax, %ebx

    .global end_of_program
end_of_program:
    int3        # プログラム実行の一時停止
    nop

即値は値そのものですから,データ転送先として指定することはできません。そのため,以下のプログラムはエラーとなります。

リスト2 アドレッシングエラー

    # レジスタ ⇒ 即値
    movl    %eax, $0x12345678

    # 即値 ⇒ 即値
    movl    $0xFFFFFFFF, $0x12345678

これまでは特に断りなく "movl"というデータ転送命令の表記を用いてきましたが,この表記は「データ転送」(move)を表す "mov" と「32 ビット長」を表す "l"(long)を組み合わせたものです。

データ転送におけるデータ長を16ビット(word)や 8ビット(byte)で行う場合は,データ長を表す "w" や "b"を指定します。

リスト3 データ長指定

    .text
    .align  4

    .global entry_point
entry_point:
    int3        # プログラム実行の一時停止

    movl    $0x12345678, %eax
    movl    $0xFFFFFFFF, %ebx
    movl    $0xFFFFFFFF, %ecx

    # 16 ビット長の転送
    movw    %eax, %ebx
    # 8 ビット長の転送
    movb    %eax, %ecx

    .global end_of_program
end_of_program:
    int3        # プログラム実行の一時停止
    nop

データ長を32ビット未満に限定した場合,レジスタ上で対象データ位置に該当しない部分は値が変更されません。

図1 データ長指定の実行例

(gdb) run
....
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00401001 in entry_point ()
(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00401016 in end_of_program ()
(gdb) info register eax ebx ecx
eax      0x12345678    305419896
ebx      0xffff5678    -43400
ecx      0xffffff78    -136
(gdb) 

なお,このプログラムに対して,asコマンドは以下のような警告を出します。

図2 データ長指定による警告

Warning: using `%bx' instead of `%ebx' due to `w' suffix
Warning: using `%ax' instead of `%eax' due to `w' suffix
Warning: using `%cl' instead of `%ecx' due to `b' suffix
Warning: using `%al' instead of `%eax' due to `b' suffix

これは,レジスタ指定アドレッシングの"%eax"が「32ビット長」であることを暗に示しているために,データ長指定の"w"や"b"と整合が取れていないことに対する警告です。

Intel 80x86アーキテクチャでは,後方互換性の維持の点から,レジスタ表記とデータ長を以下のように定めています。

表1 データ長別レジスタ表記

表記データ長意味
eax32ビット axの32ビット拡張("extended")
ax16ビット eaxの下位16ビット
ah8ビット axの上位(high)
al 8 ビットax の下位(low)

上記はEAXレジスタに対する表記例ですが,16ビット長に関する表記は他の全ての汎用レジスタに対して,8ビット長に関する表記はEBX,ECX,EDXに対して適用することができます。

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

Ruby Freaks Lounge

Rubyに関わる,執筆者自身の旬なテーマを扱った,リレー形式の連載です。

これでできる! クロスブラウザJavaScript入門

JavaScriptはウェブ制作において避けては通れない重要な言語ですが,JavaScriptに苦手意識を持たれている方は少なくないようです。 その最大の原因がクロスブラウザ対応という課題であり,本連載ではクロスブラウザ対応のテクニックを詳細に解説します。

ビジネスで成功するためのシステム運用管理のポイント

システムの多様化,技術進歩に伴い,ITシステムの運用管理の必要性が年々高まっています。本連載では,システムの運用管理とは何かについて,現場のニーズと具体的な指針を押さえながらを解説します。

2010年版SEO体得講座

本連載では,いまや企業サイトの戦略の1つとして欠かすことのできないSEOについて,最新トレンドからすぐに使えるTipsまでを紹介します。

小型Linuxサーバの最高峰 OpenBlockS 600活用指南

搭載メモリの増加,CPUクロックの向上など,あらゆる面が強化された期待の新モデルOpenBlockS 600。この記事ではOpenBlockS 600の紹介から,活用するためのさまざまなノウハウを紹介していきます。

はじめMath! Javaでコンピュータ数学

プログラミング言語入門者向けに,知っていると役立つ数学的トピックスを紹介します。簡単な演習問題と解説で,即活用できる知識を目指します。

教科書には載っていない ネットワークエンジニアの実践技術

ネットワークエンジニア,インフラエンジニアのトラブル対応には,時には「教科書通りにいかない」テクニックが必要となります。資格試験では得られないこうした実践的な技術について,実例を元に紹介します。

Googleケータイ,世に現る

2008年9月,Googleが中心となって開発されている「Android」を採用した携帯電話「T-Mobile G1」が発表されました。本連載ではT-Mobile G1を中心にGoogleケータイに迫ります。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス

最近のコメント