アセンブリ言語 言語設計

アセンブリ言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/10/19 10:04 UTC 版)

言語設計

基本要素

アセンブラの開発者によって用語の使い方に大きな差異があり、文の分類などが異なる。例えば、マシンのニーモニックや拡張ニーモニック以外は全て擬似命令と呼ぶ場合もある。典型的なアセンブリ言語は、プログラムの操作の定義に使われる命令文を以下の3種類に分類する。

  • オペコードのニーモニック
  • データセクション
  • アセンブリディレクティブ

オペコードのニーモニックと拡張ニーモニック

アセンブリ言語の命令文は一般に非常に単純で、高水準言語のそれとは異なる。一般にニーモニックは1つの機械語命令(オペコード)のシンボル名であり、個々の機械語命令には少なくとも1つのオペコード・ニーモニックが対応している。命令は一般に「オペコード」と0以上の「オペランド」で構成される。多くの命令は1つまたは2つの値を参照する。オペランドには即値(命令内に置かれる値)、レジスタ(暗黙のうちに使用される場合もある)、記憶装置内のデータの位置を示すアドレスなどがある。「拡張ニーモニック」はオペコードと特定オペランドの組合せを表すのに使われることが多い。例えば、System/360では、BC命令にマスク15を組み合わせたものがB、BC命令にマスク0を組み合わせたものがNOPという拡張ニーモニックで表される。

「拡張ニーモニック」は命令の特殊な用途をサポートするのに使われることが多く、本来の命令の名称からはその用途が連想できないときに使うことが多い。例えば、多くのCPUは明示的にNOP命令を用意していないが、その用途に使える命令は存在する。8086ではxchg ax,axという命令がnopとして使えるので、アセンブリ言語でnopを記述すると xchg ax,ax という命令に変換される。逆アセンブラにもこのあたりを認識し、xchg ax,axnopに変換するものがある。同様にIBMのSystem/360System/370のアセンブラでは、拡張ニーモニックNOPNOPRを使用し、それぞれBCBCRのマスク0の命令に変換する。SPARCアーキテクチャでは、拡張ニーモニックをsynthetic instructionsと呼んでいる[13]

アセンブラによっては単純な組み込みマクロ命令を備えており、数個の機械語命令に展開される。例えば、一部のZ80用アセンブラでは、ld hl,bc というマクロ命令を ld l,cld h,b という2命令に展開する[14]

データセクション

データと変数を保持するデータ要素を定義するのに使われる命令文がある。データの型、長さ、境界(アライメント)を定義する。また、そのデータがプログラム外部(別ファイルでアセンブルされたプログラム)からも利用可能なのか、それともデータセクションを定義したプログラム内でのみ使用可能なのかも定義できる。一部のアセンブラはこれを擬似命令に分類している。

アセンブリディレクティブ

アセンブリディレクティブは、擬似命令とも呼ばれ、アセンブラがアセンブリ実施中に実行すべき命令となっている[4]。プログラマが入力するパラメータによって、異なった形でアセンブルが行われるよう指示することができる。また、プログラムの見た目を操作して、可読性と保守性を向上させるのにも使われる。例えば、記憶装置の領域を予約し、その初期内容を指定するディレクティブなどがある。ディレクティブの名称はドットで始まることが多く、それによって通常のニーモニックと区別している。

擬似オペコード(pseudo-opcode)と言った場合、オブジェクトコードを実際に生成するディレクティブのみを指すこともある[15]

ラベル/シンボル

シンボリックアセンブラでは、任意の名前(ラベルまたはシンボル)とメモリ位置を対応付けることができる。通常、定数や変数に名前をつけることができ、命令文ではそれらの位置を名前で参照できる。実行コードではサブルーチンのエントリポイントと名前を関連付け、サブルーチンを名前で呼び出すことができる。サブルーチン内では、分岐命令の分岐先をラベルで示すことができる。一部のアセンブラは「ローカルシンボル」をサポートしており、通常のシンボルとは語彙的に区別する(例えば、"10$"を分岐先に使用する、など)。

一部のアセンブラは柔軟なシンボル管理を提供しており、複数の名前空間を管理したり、データ構造内のオフセットを自動的に計算したり、リテラル値やアセンブラが実施した単純な計算結果を参照するラベルを割り当てたりすることができる。ラベルは定数や変数をリロケータブルなアドレスで初期化するのにも使える。

コメント

他の言語と同様アセンブリ言語でもソースコードにコメントを付与でき、アセンブラはそれらを無視できる。高水準言語に比べて可読性が低いため、コメントの重要性は高い。

これらの機能を多用することで低水準のコードのコーディングや保守の問題を大幅に単純化することができる。コンパイラや逆アセンブラが生成するアセンブリソースはコメントがなく、自動生成されるシンボルが意味不明で、データ定義もないため、非常に可読性が低い。

マクロ

マクロの使用はアセンブリ言語に限らず(さらには、プログラミングに限らず)一般的な技法だが、アセンブリ言語でのプログラミングでは特に有用である。m4のような汎用のマクロプロセッサが使われることもあれば、アセンブラに組み込まれたマクロもある。以下ではアセンブラに組み込まれたマクロについて述べる。

多くのアセンブラは事前定義されたマクロをサポートしており、中にはユーザーが定義可能なマクロをサポートしているものもある。マクロは命令列と変数や定数の定義を埋め込むことができ、その中にオペコードやディレクティブの列が含まれる。マクロが定義されると、その名前をニーモニックとして使用できる。アセンブラはソース内にマクロを発見すると、対応するコード列に置き換え、元からソースにそのコード列が存在したかのように処理をする(アセンブラによっては、マクロを展開した中にマクロがあれば、それも展開することができる)。

マクロは短い名前だが、数行からかなり長い行数のコードに展開されるので、アセンブリ言語のプログラムの見た目を短くすることができる。また、マクロによってアセンブリ言語プログラムに高水準の構造を追加でき、パラメータ付きのデバッグ用コードを埋め込むなどの利用法がある。

引数が使えるマクロを持つものもある。中には洗練されたマクロ言語を備えたアセンブラもあり、オプションパラメータ、記号変数、条件文、文字列操作、算術演算などの高水準言語要素を持ち、マクロ実行中にそれらを使用でき、またマクロがコンテキストをセーブしたり情報を交換したりすることも可能である。そういったアセンブラでは、マクロの引数に基づいて大量のアセンブリ言語命令またはデータ定義を生成できる。例えば、レコード風のデータ構造や展開されたループを生成するのに使え、複雑なパラメータに基づいてアルゴリズム全体を生成することもできる。そのようなマクロで大いに拡張されたアセンブリ言語を使用すると、あたかも一種の高水準言語であるかのようにプログラムを書くことができることもある。

メインフレームの時代には、マクロは特定顧客の大規模ソフトウェアシステムのカスタマイズや、メーカーのオペレーティングシステムを顧客の要望に合わせた特注版にするのに使われていた。例えば、IBMVM/CMS、リアルタイムトランザクション処理用アドオン、CICSACP英語版/TPFコンピュータ予約システム (CRS) やクレジットカード会社で使われているトランザクションOS)などで使われてきた。

一方で、(やはりアセンブリ言語に限られないが)マクロには「落とし穴」も多い。最も単純なものとしては、式としての意味に従って変換されるのではなく、文字列から対応する文字列に変換されるためによるバグがある。例えば、次のようなマクロがあるとする。

foo: macro a
load a*b

このマクロは foo という名前で仮引数 a をとる(関数形式マクロ)。呼出・展開時にaに渡された実引数と、(グローバル変数または定数である)bとを掛け、loadする。しかし実引数が、a-cというような式であった場合、マクロとしては、load a-c*bと展開され、(おそらく)意図されていない結果を招く。これを防ぐにはマクロ定義内で仮引数は常に括弧で囲むようにするか、呼び出し時に実引数が問題を起こしそうな式の場合は括弧で囲むようにする[16]

このような問題は括弧の記述で解決することが多いが、マクロにおいて発生する問題として、一般に容易に解決できないことが知られている「名前の捕捉」という問題がある。たとえば直前の例のマクロの場合、実引数がbという名前であったとするとload b*bとなって、実引数の自乗を計算する、という、(おそらく)前述の例よりももっと意図されていない結果を招く。このようなマクロの性質を一般にこの分野の専門用語で「不健全」と言う。詳細は「健全なマクロ」の記事を参照のこと。

構造化プログラミングサポート

構造化プログラミングの要素を取り入れたアセンブラもある。最初期の例として"Concept-14 macro set"がある。Dr. H.D. Mills(March, 1970)が提案し、IBMの連邦政府システム部門のMarvin Kesslerが実装したもので、System/360のマクロアセンブラにIF/ELSE/ENDIFなどの制御構造を導入した[17]。これはRatforなどと同様の発想で、コードの表面上からGOTOを消し、制御構造風な読みやすいマクロでコードを書けるというものだった。1980年代にはこの手法が広まった。

独特の設計として、Whitesmiths Ltd.Unix系OS IdrisCコンパイラで有名)が開発した8080/Z80プロセッサ用「ストリーム指向」アセンブラ A-natural がある。この言語はオペコードやレジスタ、メモリ参照といった要素をそのまま扱えるためアセンブラと呼ばれているが、実行順序を示す構文を取り入れていた。括弧やその他の記号でプログラムのブロック構造を指定したり、生成した命令列の実行順序を制御できる。A-naturalは同社のCコンパイラが中間コードとしており、人間が直接使うものではなかったが、その構文にはファンも存在した。

また構造化プログラミングとは若干異なるが、キャリーラボBASIC風の文法のアセンブリ言語 BASE を開発した。Z80用のBASE-80とMC6809用のBASE-09がある。BASEの表記例は下記の通り(BASE-09)。

S[A,B,X,U
A=$80
A=A+$C0
S]A,B,X,U,PC

上記の記述は下記のアセンブラ表記に対応する。

PSHS A,B,X,U
LDA #$80
ADDA #$C0
PULS A,B,X,U,PC

その後、アセンブリ言語で大規模システムを開発することが少なくなり、アセンブリ言語の高機能化の需要が減っていった[18]。それでも、資源の制約が強い場合やターゲットシステムのアーキテクチャが高水準言語の効率的使用を妨げている場合、アセンブラは有用であり、高機能なアセンブラの開発も行われている[19]


  1. ^ IBMはSystem/360から2011年現在まで一貫してアセンブラ言語 (Assembler Language)と 呼んでいる。例:IBM High Level Assembler
  2. ^ MIPSのアセンブラの一部など、(分岐命令のターゲットアドレスの先頭にある機械語命令を対象として)その分岐命令の遅延スロットへの移動を(副作用がない場合に)アセンブラ疑似命令 (.set bopt) の指示に応じて行うものもある。OPTASM(SLR社)という最適化アセンブラもあった。
  1. ^ アセンブリ言語 - コトバンク
  2. ^ Stroustrup, Bjarne, The C++ Programming Language, Addison-Wesley, 1986, ISBN 0-201-12078-X: "C++ was primarily designed so that the author and his friends would not have to program in assembler, C, or various modern high-level languages." - assemblerassembly language の意味で使っている例
  3. ^ Saxon, James, and Plette, William, Programming the IBM 1401, Prentice-Hall, 1962, LoC 62-20615. - assembly program という用語を使っている例
  4. ^ a b David Salomon (1993). Assemblers and Loaders
  5. ^ bit 編集部 『bit 単語帳』共立出版、1990年8月15日、8頁。ISBN 4-320-02526-1 
  6. ^ J.DONOVAN, JOHN (1972). systems programming. pp. 59. ISBN 0-07-085175-1 
  7. ^ Beck, Leland L. (1996). “2”. System Software: An Introduction to Systems Programming. Addison Wesley 
  8. ^ a b c d Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference. INTEL CORPORATION. (1999). pp. 442 and 35. http://download.intel.com/design/PentiumII/manuals/24319102.PDF 2010年11月18日閲覧。 
  9. ^ Hyde, Randall. "Chapter 12 – Classes and Objects". The Art of Assembly Language, 2nd Edition. No Starch Press. © 2010.
  10. ^ (John Daintith, ed.) A Dictionary of Computing: "meta-assembler"
  11. ^ Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference. INTEL CORPORATION. (1999). http://download.intel.com/design/PentiumII/manuals/24319102.PDF 2010年11月18日閲覧。 
  12. ^ Evans, David (2006年). “x86 Assembly Guide”. University of Virginia. 2010年11月18日閲覧。
  13. ^ The SPARC Architecture Manual, Version 8”. SPARC, International (1992年). 2011年12月10日時点のオリジナル[リンク切れ]よりアーカイブ。2012年10月27日閲覧。
  14. ^ Z80 Op Codes for ZINT
  15. ^ Microsoft Corporation. “MASM: Directives & Pseudo-Opcodes”. 2011年3月19日閲覧。
  16. ^ Macros (C/C++) | Microsoft Docs
  17. ^ Concept 14 Macros”. MVS Software. 2009年5月25日閲覧。
  18. ^ Answers.com. “assembly language: Definition and Much More from Answers.com”. 2008年6月19日閲覧。
  19. ^ NESHLA: The High Level, Open Source, 6502 Assembler for the Nintendo Entertainment System
  20. ^ Salomon. Assemblers and Loaders. p. 7. http://www.davidsalomon.name/assem.advertis/asl.pdf 2012年1月17日閲覧。 
  21. ^ The IBM 650 Magnetic Drum Calculator”. 2012年1月17日閲覧。
  22. ^ Jim Lawless (2004年5月21日). “Speaking with Don French : The Man Behind the French Silk Assembler Tools”. 2008年8月21日時点のオリジナル[リンク切れ]よりアーカイブ。2008年7月25日閲覧。
  23. ^ 松 --- 事実上最初のパソコン用日本語ワープロソフト
  24. ^ Toolchain, libraries and headers relationship - PlayStation Development Network
  25. ^ What were PS1 and N64 games written in? : gamedev
  26. ^ SegaBase Volume 6 - Saturn”. Eidolon's Inn (2008年1月10日). 2014年7月2日時点のオリジナル[リンク切れ]よりアーカイブ。2013年6月27日閲覧。
  27. ^ Lispによるリターゲッタブルコードジェネレータの実装 (PDF) Archived 2008年8月20日, at the Wayback Machine.
  28. ^ OOエンジニアの輪! ~ 第 21 回 川合史朗 さんの巻 ~ | オブジェクトの広場
  29. ^ NVIDIA Xbox GPU Specs | TechPowerUp GPU Database
  30. ^ Using Shaders in Direct3D 10 - Win32 apps | Microsoft Docs
  31. ^ [CEDEC]「FINAL FANTASY XV」の最適化はこうして行われた - GamesIndustry.biz Japan Edition
  32. ^ Rusling, David A.. “The Linux Kernel”. 2012年3月11日閲覧。
  33. ^ a b Writing the Fastest Code, by Hand, for Fun: A Human Computer Keeps Speeding Up Chips”. New York Times, John Markoff (2005年11月28日). 2010年3月4日閲覧。
  34. ^ Bit-field-badness”. hardwarebug.org (2010年1月30日). 2010年2月5日時点のオリジナル[リンク切れ]よりアーカイブ。2010年3月4日閲覧。
  35. ^ GCC makes a mess”. hardwarebug.org (2009年5月13日). 2010年3月16日時点のオリジナル[リンク切れ]よりアーカイブ。2010年3月4日閲覧。
  36. ^ Randall Hyde. “The Great Debate”. 2008年6月16日時点のオリジナル[リンク切れ]よりアーカイブ。2008年7月3日閲覧。
  37. ^ Code sourcery fails again”. hardwarebug.org (2010年1月30日). 2010年4月2日時点のオリジナル[リンク切れ]よりアーカイブ。2010年3月4日閲覧。
  38. ^ BLAS Benchmark-August2008”. eigen.tuxfamily.org (2008年8月1日). 2010年3月4日閲覧。
  39. ^ x264.git/common/x86/dct-32.asm”. git.videolan.org (2010年9月29日). 2012年3月4日時点のオリジナル[リンク切れ]よりアーカイブ。2010年9月29日閲覧。
  40. ^ 68K Programming in Fargo II”. 2008年7月2日時点のオリジナル[リンク切れ]よりアーカイブ。2008年7月3日閲覧。
  41. ^ Hyde, Randall (1996年9月30日). “Foreword ("Why would anyone learn this stuff?"), op. cit.”. 2010年3月25日時点のオリジナル[リンク切れ]よりアーカイブ。2010年3月5日閲覧。
  42. ^ Randall Hyde. “Which Assembler is the Best?”. 2007年10月18日時点のオリジナル[リンク切れ]よりアーカイブ。2007年10月19日閲覧。






固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「アセンブリ言語」の関連用語

アセンブリ言語のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



アセンブリ言語のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのアセンブリ言語 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2022 GRAS Group, Inc.RSS