アセンブリ言語 アセンブリ言語の概要

アセンブリ言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/01/07 06:50 UTC 版)

モトローラ MC6800 のアセンブリ言語のソースコード

アセンブリ言語(アセンブリげんご、: assembly languageアセンブリ)はビット列命令に対応した文字列命令を利用する低水準プログラミング言語の総称である[1]

アセンブラ: Assembler)またはアセンブラ言語: Assembler Language)とも呼ばれる[注 1][2]

概要

プロセッサ機械語プログラムを直接読み取り実行する。しかし人間にとってビット列は直観的に理解しづらいため、機械語コーディングは容易でない。これを解決するために、ビット列に対応する文字列命令(ニーモニック)を利用するプログラミング言語の総称がアセンブリ言語である[1]

アセンブリ言語を用いることで、機械語相当の低水準なコードをより直観的に記述できる。高度なアセンブリ言語ではアセンブラに対する命令(疑似命令)やマクロを用いて、より抽象的な記述が可能である[注 2]パイプライン処理などを最適化するために命令順序を入れ替えたり、ラベルの位置関係によってアドレッシングモードを最適化するアセンブラもあり、必ずしもソーステキストの記述とアセンブルの結果が直接対応するとは限らない。

アセンブリ言語は機械語と強く結びついているため、各プロセッサ向けに仕様の異なる様々な(具体的な)アセンブリ言語が存在する(「アセンブリ言語」は総称である)。同じ命令セットに対しても複数のアセンブリ言語が存在しうる(例: GNUアセンブラのgasのインテルプロセッサ用)。

アセンブリ言語の基本文法として、1つの命令は1つのニーモニックと0個以上のオペランドからなる。プログラム全体はニーモニック/オペランド列、ディレクティブや擬似命令と呼ばれるメタな文、コメント、データで構成されている。通常の文はオペコードのニーモニックで始まり、パラメータ(データ、引数)のリストがそれに続く[3]。多くのアセンブリ言語はオペランドのアドレスや定数をラベル・シンボルで記述できハードコーディングを避けられる。

基本文法

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

ニーモニック

ニーモニック: mnemonic)は処理内容に応じて各機械語命令に与えられた文字列・命令語である[4]。機械語のオペコードに相当する。

ビット列である機械語はその処理が直観的にわからないため、機械語コーディングは容易でない。人間がより容易に機械語と同等なコードを書くため、ビット列を意味ある文字列で表現するニーモニックが発明された[4]。例えばX64機械語 0x05 は「整数の加算」を意味するのでニーモニック ADD を対応させる。個々の機械語命令には少なくとも1つのニーモニックが対応する。

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

命令は一般に「オペコード」と0以上の「オペランド」で構成される。多くの命令は1つまたは2つの値を参照する。オペランドには即値(命令内に置かれる値)、レジスタ(暗黙のうちに使用される場合もある)、記憶装置内のデータの位置を示すアドレスなどがある。「拡張ニーモニック」はオペコードと特定オペランドの組合せを表すのに使われることが多い。例えば、System/360では、BC命令にマスク15を組み合わせたものがB、BC命令にマスク0を組み合わせたものがNOPという拡張ニーモニックで表される。オペランドの順序(例: ソースとディスティネーションの前後)は言語に依る。

オペランド

オペランド: operand被演算子)は命令の対象・引数である。1つの命令では、ニーモニックに続き0個以上のオペランドが記述される。オペランドにはソースとデスティネーションの二種類があり、データとして読み取られるのがソースで、オペコードで示された命令の実行結果が格納されるのがデスティネーションである。ソースには定数・レジスタ・メモリのいずれか、デスティネーションにはレジスタ・メモリのいずれかを指定する。

データセクション

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

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

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

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

ラベル/シンボル

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

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

x86/IA-32プロセッサにおいて8ビット即値レジスタに入れる命令を例にとる。

この命令のバイナリコードは 10110 で、その後に3ビットのレジスタを指定する識別子が続く。AL レジスタの識別子は 000 なので、次に示す機械語AL レジスタに 01100001 というデータをロードする[8]

10110000 01100001

このバイナリコードを人間が読みやすいように十六進法で表現すると次のようになる。

B0 61

ここで、B0は「ALに後続の値をコピーする」ことを意味し、61は01100001を十六進法で表したもの(十進法では97)である。インテルのアセンブリ言語では、この種の命令に MOV というニーモニックを割り当てており、セミコロン以下に説明的コメントを添えたアセンブリ言語での表現は次のようになる。

MOV AL, 61h       ; Load AL with 97 decimal (61 hex)

この場合、定数61Hがソース、レジスタALがデスティネーションに該当し、命令が実行されると、定数61Hが、レジスタALに単純に格納される。これが人間にとってはさらに読みやすく覚えやすい。

前述のインテルの MOV のようにデータの転送の多くを同一の命令あるいはニーモニックとする場合もあれば、データのコピー/移動の方向などによって別々の命令あるいはニーモニックとする場合もある(「メモリからレジスタへの移動」を L、「レジスタからメモリへの移動」を ST、「レジスタからレジスタへの移動」を LR、「即値をメモリへ移動」を MVI など)。(この段落では命令セットの設計の話とアセンブリ言語の話を一緒にしている)

インテルのオペコード 10110000(B0)は8ビットの値を AL レジスタにコピーするが、10110001(B1)はCLレジスタにコピーし、10110010(B2)は DL レジスタにコピーする。これらをアセンブリ言語で表現すると次のようになる[8]

MOV AL, 1h        ; Load AL with immediate value 1
MOV CL, 2h        ; Load CL with immediate value 2
MOV DL, 3h        ; Load DL with immediate value 3

MOVの構文には次の例のようにさらに複雑なものもある[9]

MOV EAX, [EBX]	  ; Move the 4 bytes in memory at the address contained in EBX into EAX
MOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX

MOVというニーモニックを使った文は、その内容によってアセンブラが88-8E、A0-A3、B0-B8、C6、C7のいずれかのオペコードに変換するので、プログラマはオペコードを知る必要がないし、オペコードを覚える必要もない[8]


  1. ^ IBMはSystem/360から2011年現在まで一貫してアセンブラ言語 (Assembler Language)と 呼んでいる。例:IBM High Level Assembler
  2. ^ MIPSのアセンブラの一部など、(分岐命令のターゲットアドレスの先頭にある機械語命令を対象として)その分岐命令の遅延スロットへの移動を(副作用がない場合に)アセンブラ疑似命令 (.set bopt) の指示に応じて行うものもある。OPTASM(SLR社)という最適化アセンブラもあった。
  3. ^ 厳密にはCPUのビット幅に依存するが、マクロ定義はこれを条件付きコンパイルによりカバーしている。
  4. ^ GCC等、C言語への拡張によりシンボルへのセクション指定が可能なコンパイラはあるが、コンパイラへの強い依存性が生じる。アセンブリ言語であれば、およそセクションをサポートしたオブジェクトファイルが出力できるならばセクションの指定は何らかの手段で実装可能となる。
  1. ^ a b "ニモニックによって表したプログラムをアセンブリ言語(assembly language)プログラムと呼ぶ。" 伊藤. 機械語とアセンブリ言語. 埼玉大学, 電気電子物理工学実験III. 2022-12-25閲覧.
  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. ^ 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日閲覧。 
  4. ^ a b "各命令に、人間にとって意味があり、その命令が行う処理を類推できる文字列を対応付ける。この文字列をニモニック(mnemonic)と呼ぶ。" 伊藤. 機械語とアセンブリ言語. 埼玉大学, 電気電子物理工学実験III. 2022-12-25閲覧.
  5. ^ The SPARC Architecture Manual, Version 8”. SPARC, International (1992年). 2011年12月10日時点のオリジナルよりアーカイブ。2012年10月27日閲覧。
  6. ^ a b David Salomon (1993). Assemblers and Loaders
  7. ^ Microsoft Corporation. “MASM: Directives & Pseudo-Opcodes”. 2011年3月19日閲覧。
  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. ^ Evans, David (2006年). “x86 Assembly Guide”. University of Virginia. 2010年11月18日閲覧。
  10. ^ gotoが存在する言語もあるが、限定利用が推奨される
  11. ^ Answers.com. “assembly language: Definition and Much More from Answers.com”. 2008年6月19日閲覧。
  12. ^ NESHLA: The High Level, Open Source, 6502 Assembler for the Nintendo Entertainment System
  13. ^ Z80 Op Codes for ZINT
  14. ^ コンピュータ予約システム (CRS) やクレジットカード会社で使われているトランザクションOS
  15. ^ Dr. H.D. Mills (1970) 提案、Marvin Kessler 実装 in IBM連邦政府システム部門
  16. ^ Concept 14 Macros”. MVS Software. 2009年5月25日閲覧。
  17. ^ Saxon, James, and Plette, William, Programming the IBM 1401, Prentice-Hall, 1962, LoC 62-20615. - assembly program という用語を使っている例
  18. ^ J.DONOVAN, JOHN (1972). systems programming. pp. 59. ISBN 0-07-085175-1 
  19. ^ bit 編集部『bit 単語帳』共立出版、1990年8月15日、8頁。ISBN 4-320-02526-1 
  20. ^ Hyde, Randall. "Chapter 12 – Classes and Objects". The Art of Assembly Language, 2nd Edition. No Starch Press. © 2010.
  21. ^ (John Daintith, ed.) A Dictionary of Computing: "meta-assembler"
  22. ^ Beck, Leland L. (1996). “2”. System Software: An Introduction to Systems Programming. Addison Wesley 
  23. ^ Randall Hyde. “Which Assembler is the Best?”. 2007年10月18日時点のオリジナルよりアーカイブ。2007年10月19日閲覧。
  24. ^ Salomon. Assemblers and Loaders. p. 7. http://www.davidsalomon.name/assem.advertis/asl.pdf 2012年1月17日閲覧。 
  25. ^ The IBM 650 Magnetic Drum Calculator”. 2012年1月17日閲覧。
  26. ^ Jim Lawless (2004年5月21日). “Speaking with Don French : The Man Behind the French Silk Assembler Tools”. 2008年8月21日時点のオリジナルよりアーカイブ。2008年7月25日閲覧。
  27. ^ 松 --- 事実上最初のパソコン用日本語ワープロソフト
  28. ^ Toolchain, libraries and headers relationship - PlayStation Development Network
  29. ^ What were PS1 and N64 games written in? : gamedev
  30. ^ SegaBase Volume 6 - Saturn”. Eidolon's Inn (2008年1月10日). 2014年7月2日時点のオリジナルよりアーカイブ。2013年6月27日閲覧。
  31. ^ Lispによるリターゲッタブルコードジェネレータの実装 (PDF) Archived 2008年8月20日, at the Wayback Machine.
  32. ^ OOエンジニアの輪! ~ 第 21 回 川合史朗 さんの巻 ~ | オブジェクトの広場
  33. ^ NVIDIA Xbox GPU Specs | TechPowerUp GPU Database
  34. ^ Using Shaders in Direct3D 10 - Win32 apps | Microsoft Docs
  35. ^ Rusling, David A.. “The Linux Kernel”. 2012年3月11日閲覧。
  36. ^ 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日閲覧。
  37. ^ Bit-field-badness”. hardwarebug.org (2010年1月30日). 2010年2月5日時点のオリジナルよりアーカイブ。2010年3月4日閲覧。
  38. ^ GCC makes a mess”. hardwarebug.org (2009年5月13日). 2010年3月16日時点のオリジナルよりアーカイブ。2010年3月4日閲覧。
  39. ^ Randall Hyde. “The Great Debate”. 2008年6月16日時点のオリジナルよりアーカイブ。2008年7月3日閲覧。
  40. ^ Code sourcery fails again”. hardwarebug.org (2010年1月30日). 2010年4月2日時点のオリジナルよりアーカイブ。2010年3月4日閲覧。
  41. ^ [CEDEC]「FINAL FANTASY XV」の最適化はこうして行われた - GamesIndustry.biz Japan Edition
  42. ^ x264.git/common/x86/dct-32.asm”. git.videolan.org (2010年9月29日). 2012年3月4日時点のオリジナルよりアーカイブ。2010年9月29日閲覧。
  43. ^ “[https://github.com/torvalds/linux/blob/master/include/linux/export.h GitHub, torvalds / linux, include/linux/export.h]”. 2023年10月8日閲覧。
  44. ^ Hyde, Randall (1996年9月30日). “Foreword ("Why would anyone learn this stuff?"), op. cit.”. 2010年3月25日時点のオリジナルよりアーカイブ。2010年3月5日閲覧。


「アセンブリ言語」の続きの解説一覧




固有名詞の分類


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

辞書ショートカット

すべての辞書の索引

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

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

   

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



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

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

©2024 GRAS Group, Inc.RSS