(Translated by https://www.hiragana.jp/)
アセンブリ言語 - Wikipedia コンテンツにスキップ

アセンブリ言語げんご

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Assembly languageから転送てんそう
モトローラ 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]

高級こうきゅう言語げんごとのちが

[編集へんしゅう]

アセンブリ言語げんごてい水準すいじゅんプログラミング言語げんごであり、C言語げんごなどの高級こうきゅう言語げんごより抽象ちゅうしょうひくい。すなわち言語げんご機能きのう構文こうぶんかた)がすくない。つぎひょうは「基本きほんてきなアセンブリ言語げんご」と高級こうきゅう言語げんごあいだにある言語げんご機能きのうである。

ひょう. アセンブリ言語げんご高級こうきゅう言語げんご
アセンブラ 高級こうきゅう言語げんご
レジスタ -
ジャンプ命令めいれい [10]
制御せいぎょ構造こうぞう -
構造こうぞうたい -
関数かんすう -
コメント

このはあくまで言語げんご機能きのうである。「高級こうきゅう言語げんごでのみ可能かのう、アセンブリ言語げんごでは不可ふか」という意味いみではない。たとえばアセンブリ言語げんご関数かんすう構文こうぶん存在そんざいしないが関数かんすう相当そうとうするパターンが存在そんざいする(関数かんすうプロローグ・エピローグ英語えいごばん)。より正確せいかくないいかたをすれば、アセンブラで頻出ひんしゅつするパターンを1つの機能きのうとして言語げんご仕様しようんで抽象ちゅうしょうげていった言語げんご高級こうきゅう言語げんごである。

高水準こうすいじゅん文法ぶんぽう

[編集へんしゅう]

より抽象ちゅうしょうされすくないコードりょうでアセンブラをくために様々さまざま高水準こうすいじゅん文法ぶんぽうがアセンブリ言語げんご導入どうにゅうされてきた。現在げんざいでは高水準こうすいじゅんのメインストリームは高級こうきゅう言語げんごうつった一方いっぽう[11]目的もくてきおうじてアセンブリ言語げんご選択せんたくするユーザーけに高機能こうきのうなアセンブリ言語げんご開発かいはつつづいている[12]

アセンブリ言語げんごにおいてもマクロ利用りようされる。一般いっぱんてきなマクロと同様どうよう高度こうどなアセンブラマクロでは制御せいぎょ構文こうぶん導入どうにゅう引数ひきすう展開てんかい・ユーザー定義ていぎマクロ適用てきようなどが可能かのうである。文字もじれつであるオペコード・ニーモニックはマクロの対象たいしょうとなるため、これを利用りようして疑似ぎじニーモニックによる記述きじゅつ可能かのうになる。

たとえば、一部いちぶZ80ようアセンブラでは、ld hl,bc というマクロ命令めいれいld l,cld h,b という2命令めいれい展開てんかいする[13]。メインフレームの時代じだいには、マクロは特定とくてい顧客こきゃくだい規模きぼソフトウェアシステムのカスタマイズや、メーカーのオペレーティングシステムを顧客こきゃく要望ようぼうわせた特注とくちゅうばんにするのに使つかわれていた。IBMVM/CMS、リアルタイムトランザクション処理しょりようアドオン、CICSACP英語えいごばん/TPF[14]などで使つかわれてきた。

制御せいぎょ構造こうぞう

[編集へんしゅう]

構造こうぞうプログラミング要素ようそれたアセンブラもある。最初さいしょには "Concept-14 macro set" がSystem/360のマクロアセンブラにIF/ELSE/ENDIFなどの制御せいぎょ構造こうぞう導入どうにゅうした[15][16]。また8080/Z80プロセッサけの A-natural ではブロック構造こうぞう命令めいれい実行じっこう順序じゅんじょ制御せいぎょ採用さいようされた。

また構造こうぞうプログラミングとは若干じゃっかんことなるが、キャリーラボ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

アセンブラ

[編集へんしゅう]

アセンブルえい: assemble)はアセンブリ言語げんごかれたプログラムから機械きかいかれたオブジェクトコードへの変換へんかんである。具体ぐたいてきには、ニーモニックをオペコード変換へんかんシンボルめいをメモリ位置いち実体じったい変換へんかんする[6]

アセンブルは比較的ひかくてき単純たんじゅん規則きそくからなるため、ひとでも実行じっこうできる(ハンドアセンブル)。単純たんじゅん作業さぎょう効率こうりつくミスおこなうのはプログラムの得意とくい分野ぶんやであり、そのようなソフトウェアが開発かいはつされた。このアセンブリをおこなうプログラムをアセンブラえい: assembler)という。初期しょきにはアセンブリプログラムともばれた[17]

シンボルめいによる参照さんしょう利用りようはアセンブラの重要じゅうよう機能きのうであり、面倒めんどう計算けいさんやプログラム修正しゅうせいともなうアドレスの更新こうしん手間てまはぶくことができる。また、オブジェクトコードを生成せいせいするさい、ローダよう情報じょうほうあわせて生成せいせいするアセンブラもある[18]。マクロをふくむアセンブリ言語げんご対応たいおうしている場合ばあい処理しょりけいにはm4のような汎用はんようプロセッサあるいはプロセッサ内蔵ないぞうアセンブラ(マクロアセンブラ)が利用りようされる[19]ポリモーフィズム継承けいしょう[8]などをもつ高水準こうすいじゅんアセンブリ言語げんご対応たいおうしたアセンブラは高水準こうすいじゅんアセンブラ英語えいごばんばれる[20]

動作どうさプラットフォーム以外いがいのターゲットプラットフォームを選択せんたくできるアセンブラはクロスアセンブラともばれる(参考さんこう: クロスコンパイラ)。メタアセンブラは、アセンブリ言語げんご文法ぶんぽう意味いみろん記述きじゅつしたものを入力にゅうりょくとし、その言語げんごのためのアセンブラを出力しゅつりょくするプログラムである[21]

ぎゃく方向ほうこう変換へんかん、すなわちオブジェクトコードのアセンブリ言語げんごをおこなうプログラムをぎゃくアセンブラという。

分類ぶんるい

[編集へんしゅう]

アセンブラは様々さまざま観点かんてんから分類ぶんるいできる。パス回数かいすう(アセンブルのソースファイル走査そうさ回数かいすう)の観点かんてんではワンパスアセンブラマルチパスアセンブラ分類ぶんるいできる。

ワンパスアセンブラ
ソースコードを1かいだけパスするアセンブラ。定義ていぎされるまえにシンボルが使つかわれているとオブジェクトコードの最後さいごに "errata" を必要ひつようがあり、リンカまたはローダ定義ていぎシンボルが使つかわれていた位置いちにあるプレースホルダーをえる。あるいは、未定義みていぎなシンボルを使用しようするとエラーになる。
マルチパスアセンブラ
最初さいしょのパスでぜんシンボルとそのひょう作成さくせいし、そのひょう使つかってそののパスでコードを生成せいせいする。

どちらの場合ばあいも、アセンブラは最初さいしょのパスでかく命令めいれいのサイズを確定かくていさせる必要ひつようがあり、それによってのち出現しゅつげんするシンボルのアドレスを計算けいさんする。命令めいれいのサイズはから定義ていぎされるオペランドのかた距離きょり依存いぞんすることがあるため、アセンブラは最初さいしょのパスでは悲観ひかんてき見積みつもりをし、必要ひつようおうじてそののパスまたは errata にて1つ以上いじょうNOP命令めいれいなにもしない命令めいれい)を挿入そうにゅうしてすきめる必要ひつようがある。最適さいてきおこなうアセンブラでは、最初さいしょ悲観ひかんてきコードをそののパスで稠密ちゅうみつなコードにえてアドレスのさい計算けいさんおこなうことがある。

もともとワンパスアセンブラは高速こうそくであるためよく使つかわれていた。マルチパス動作どうさをするには、磁気じきテープもどしたりパンチカードのデッキをセットしなおして必要ひつようがあったためである。現代げんだいのコンピュータではマルチパスであってもそのような遅延ちえんしょうじない。マルチパスアセンブラは errata がないため、リンク処理しょり(アセンブラが直接ちょくせつ実行じっこうコードを生成せいせいする場合ばあいローダ処理しょり)が高速こうそくされる[22]

おもなアセンブラ

[編集へんしゅう]

Unixけいシステムでは、アセンブラを as とぶのが一般いっぱんてきだが、実体じったいはそれぞれのOSでことなる。GNUアセンブラ使つかっているものがおおい。

おな系統けいとうのプロセッサであっても、複数ふくすうのアセンブリ言語げんご方言ほうげん存在そんざいする。アセンブラによっては方言ほうげんのアセンブリ言語げんご使用しよう可能かのう場合ばあいがある。たとえば、TASMMASMようコードを入力にゅうりょくとして可能かのうだが、ぎゃく不可能ふかのうである。FASM英語えいごばんNASM文法ぶんぽうがほぼおなじだが、サポートしているマクロがことなるため、相互そうご翻訳ほんやく困難こんなんである。いずれも基本きほん機能きのうおなじだが、追加ついか機能きのう差異さいがある[23]

歴史れきし

[編集へんしゅう]

アセンブリ言語げんごは、ごく単純たんじゅんなものまでふくめれば、プログラム内蔵ないぞう方式ほうしきのコンピュータの最初さいしょの1940年代ねんだいから存在そんざいしている。世界せかい最初さいしょ実用じつようてき稼働かどうしたノイマンがた電子でんし計算けいさんとされるEDSAC (1949) の initial orders現代げんだい用語ようごではブートローダーに相当そうとうするもの)は、テープにパンチされたじゅうしんによるアドレスを、内部ないぶ表現ひょうげんしん変換へんかんするなどの機能きのうっていた(命令めいれいについては、「1文字もじのニーモニック」にえるかもしれないが、それは実際じっさいには同機どうき機械きかいそのものである)[24]ナサニエル・ロチェスターは1954ねんIBM 701 ようアセンブラをいている。1955ねん、Stan Poley が IBM 650 用言ようげんアセンブリSOAP (Symbolic Optimal Assembly Program) を開発かいはつした[25]

コンピュータの歴史れきし初期しょきには、このような、プログラムによって機械きかいプログラムを生成せいせいすることを自動じどうプログラミングんだ。

ドナルド・ギリースは、まだ発明はつめいされていなかったアセンブラを開発かいはつちゅうに、フォン・ノイマンから開発かいはつ即座そくざめるようにわれた、という1950年代ねんだい初期しょきならではの逸話いつわがある。当時とうじは、人間にんげん手作業てさぎょうでもできるような瑣末さまつ仕事しごとをコンピュータにさせるような時代じだいるとはかんがえられておらず、たん時間じかん無駄むだだとノイマンはかんがえたのである。

歴史れきしてきには多数たすうのプログラム(OSやアプリケーション)がアセンブリ言語げんごだけでかれてきた。ALGOL方言ほうげんであるESPOLかれた Burroughs MCP (1961) が登場とうじょうするまで、オペレーティングシステムはアセンブリ言語げんごくのが普通ふつうだった。IBMメインフレームようソフトウェアのおおくはアセンブリ言語げんごかれていた。COBOLFORTRANPL/I などがってわっていったが、1990年代ねんだいになってもアセンブリ言語げんごのコードベースを保守ほしゅつづけていただい企業きぎょうすくなくない。

初期しょきマイクロコンピュータでも同様どうようひろもちいられた。これは、リソースの制約せいやくきびしく、メモリやディスプレイのアーキテクチャが特殊とくしゅだったからである。また、マイクロコンピュータけの高水準こうすいじゅん言語げんごのコンパイラがなかったというめん重要じゅうようである。また、初期しょきのマイクロコンピュータのユーザは趣味しゅみとしての使用しようおもであり、なんでも自前じまえつくるという精神せいしんもそれに影響えいきょうしていたとられる。

1980年代ねんだいから1990年代ねんだいにかけて、ホームコンピュータZX Spectrumコモドール64AmigaAtari ST など)でもアセンブリ言語げんごがよく使つかわれていた。というのもそれらのBASICは性能せいのうひくく、ハードウェアのぜん機能きのう利用りようできないことがおおかったためである。たとえば、Amigaにはフリーウェアのアセンブリ言語げんご統合とうごう開発かいはつ環境かんきょう ASM-One assembler があり、Microsoft Visual Studio匹敵ひってきする機能きのうそなえていた。

Don French が開発かいはつした VIC-20 ようアセンブラは 1,639 バイトというちいささで、世界一せかいいちちいさいアセンブラとわれている。アドレスをシンボルで表現ひょうげんでき、各種かくしゅアドレス計算けいさん四則しそく演算えんざん、AND、OR、べきじょうなど)が可能かのうだった[26]

1980年代ねんだいのビジネスソフトでは、たとえばおもて計算けいさんソフト Lotus 1-2-3 などはアセンブリ言語げんごかれていた。日本にっぽんではまつなどが該当がいとう[27]する。

1990年代ねんだいはいっても、コンシューマーゲームおおくはアセンブリ言語げんごでプログラムがかれていた。しかしゲーム内容ないよう複雑ふくざつし、プログラムの規模きぼ増大ぞうだいするにつれて、アセンブラでは開発かいはつ困難こんなんとなり、高水準こうすいじゅん言語げんごによる開発かいはつ主流しゅりゅうとなっていった。たとえばプレイステーションではGCC公式こうしきのSDKにふくまれていて、標準ひょうじゅん開発かいはつ言語げんごC言語げんごであった[28][29]。この時代じだいのゲーム3次元じげんコンピュータグラフィックス積極せっきょくてき導入どうにゅうはじまっており、ハードウェア性能せいのう向上こうじょうしたことから、C言語げんごによる開発かいはつ十分じゅうぶん可能かのうとなったが、コンパイラの最適さいてき能力のうりょく成熟せいじゅくだったこともあいまって、ハードウェア性能せいのう最大限さいだいげんすにはアセンブリ言語げんご駆使くしした手動しゅどう最適さいてきこまかなチューニングが必要ひつようとなることもおおかった。セガサターン最高さいこう性能せいのうしてプレイステーション対抗たいこうするには、アセンブリ言語げんご使つかうしかなかったとべていた業界ぎょうかい関係かんけいしゃもいた[30]。ただし一方いっぽうで、ファミコン時代じだいすでにメタルスレイダーグローリースーパーファミコンMOTHER 2シムシティ[31]、プレイステーションのクラッシュ・バンディクー[32]開発かいはつ一部いちぶLISP使つかわれていたというはなしもあり、当時とうじのコンシューマーゲームの分野ぶんやではアセンブリ言語げんごやC言語げんごすべてだったというわけではない。

2000年代ねんだい初頭しょとうマイクロソフト原始げんしてきプログラマブルシェーダー対応たいおうしたDirectX (Direct3D) 8.0をリリースした。このDirect3D 8.0におけるシェーダープログラムは、グラフィックスハードウェアに依存いぞんしないなかあいだ言語げんご(バイトコード)を出力しゅつりょくすることのできるアセンブリ言語げんご(シェーダーアセンブラ)を使用しようして記述きじゅつするものだった。2001ねんには世界せかいはじめてプログラマブルシェーダーに対応たいおうしたコンシューマーゲームとして初代しょだいXbox登場とうじょうしたが、このXboxに搭載とうさいされていたグラフィックスAPIもDirect3D 8.x相当そうとうのカスタマイズばん[33]であり、CPUじょう実行じっこうするホストプログラム(ゲームアプリケーション本体ほんたいのコード)はC++使つかって記述きじゅつする一方いっぽうGPUうえ実行じっこうするシェーダープログラムの記述きじゅつにはアセンブラを使用しようしていた。のちにHLSLCg (C for Graphics) といった高水準こうすいじゅんシェーディング言語げんご開発かいはつされ、HLSLに対応たいおうしたDirect3D 9.0以降いこうはシェーダープログラムも高水準こうすいじゅん言語げんご利用りようして記述きじゅつするようになった。Direct3D 10のシェーダーモデル4.0以降いこうは、シェーダーアセンブラではなくHLSLの使用しよう必須ひっすとなっている[34]

現在げんざい最適さいてきコンパイラ人手ひとでかれたアセンブリ言語げんごのコードと同等どうとう性能せいのう発揮はっきするとわれている[35]例外れいがいもある[36][37][38])。最近さいきん[いつ?]のプロセッサやメモリサブシステムは複雑ふくざつしてきたため、コンパイラでもアセンブリ言語げんごでも効果こうかてき最適さいてきがますます困難こんなんになってきている[39][40]。さらにプロセッサが高性能こうせいのうりつそく入出力にゅうしゅつりょくページングうつることで、コーディングが性能せいのう向上こうじょう貢献こうけんするケースは以前いぜんよりすくなくなっている。

一方いっぽうC++C#のような、Cよりもさらに高水準こうすいじゅん言語げんご主流しゅりゅうになってからも、コンパイラが出力しゅつりょくしたアセンブリコードを解析かいせきして最適さいてきやチューニングの余地よちさぐるといった手法しゅほう一般いっぱんてきおこなわれている[41]

利用りよう

[編集へんしゅう]

てい水準すいじゅん言語げんごであるアセンブラはC言語げんごなどの高級こうきゅう言語げんごことなる領域りょういき利用りようされる。

目的もくてき

[編集へんしゅう]

アセンブラをもちいる目的もくてきとして以下いかげられる。

  • 高速こうそく: レジスタ利用りようやループ展開てんかい最適さいてき
  • しょうフットプリント: ランタイムや標準ひょうじゅんライブラリの排除はいじょ
  • リアルタイム(時間じかんてき正確せいかくせい): GCスパイク、ページフォルトプリエンプション排除はいじょ
  • ハードウェア操作そうさ
  • 高級こうきゅう言語げんご対応たいおう命令めいれい利用りよう
  • 挙動きょどう理解りかい

事例じれい

[編集へんしゅう]

アセンブリ言語げんごもちいられる事例じれいとして以下いかげられる。

  • みシステム: しょうフットプリントでのハードウェア操作そうさ目的もくてき
    • 電話機でんわきのファームウェア
    • 自動車じどうしゃ燃料ねんりょう点火てんかシステム
    • センサー
  • デバイスドライバみハンドラブートコードBIOSPOST
    • ハードウェアないしはファームウェアの規約きやくをアセンブリ言語げんごによりカーネルやドライバにて使用しようしている高級こうきゅう言語げんご規約きやく変換へんかんすることにより、主要しゅよう機能きのう高級こうきゅう言語げんご実装じっそうすることができる。
  • 暗号あんごう: 高級こうきゅう言語げんご対応たいおう命令めいれい使用しよう目的もくてき
  • 数値すうち計算けいさん: 高速こうそく目的もくてき
  • リアルタイムシステム: リアルタイムせい目的もくてき
    • フライ・バイ・ワイヤシステム: 航空こうくう航法こうほうシステムの一種いっしゅテレメトリ厳密げんみつ制限せいげん時間じかんない解釈かいしゃくして対応たいおうする必要ひつよう
    • 医療いりょう装置そうち
  • 暗号あんごうアルゴリズムはつね厳密げんみつおな時間じかん実行じっこうすることで、タイミング攻撃こうげきふせぐ。
  • 高度こうどなセキュリティが要求ようきゅうされ、環境かんきょう完全かんぜん制御せいぎょする必要ひつようがある場合ばあい
  • 監視かんし・トレース・デバッグのための命令めいれいセットシミュレータで、追加ついかのオーバーヘッドを最小さいしょうたもちたい場合ばあい
  • リバースエンジニアリング: 挙動きょどう理解りかい目的もくてき
    • デバッグ: れい - コンパイラ最適さいてき確認かくにん
    • ソフトウェア改造かいぞう: れい - 商用しょうようコンピュータゲーム改造かいぞう
    • ハッキング: れい - コピープロテクト解除かいじょ
    • 学習がくしゅう: コンピュータの理解りかい
  • 自己じこえコード
  • コードサイズの上限じょうげん制限せいげんがある環境かんきょう
    • ブートセクタ格納かくのうするブートローダれいとして、MBRでは最大さいだい446バイト。
    • トラップ処理しょりシグナルハンドラ起動きどうなどのために、カーネルがプロセスのアドレス空間くうかんせるコード。vDSOもちい、プロセスからはシェアードオブジェクトをんだようにせる実装じっそうおおい。
      • せるコードの範囲はんい正確せいかく把握はあくする必要ひつようがあるため、コードのエントリだけでなく終了しゅうりょうにもラベルをあたえる。アセンブリ言語げんごでは容易よういだが、高級こうきゅう言語げんごでは一般いっぱん不要ふよう機能きのうなのでサポートされていない。
      • 元来がんらいはユーザモードようのスタックじょうにカーネルからコードをコピーして実行じっこうしていた。欠点けってんとして、スタックはユーザモードでのみが禁止きんしできず、スタックじょうでのコード実行じっこうがセキュリティホールとしてしばしば利用りようされたことから、実装じっそう方法ほうほう変更へんこうすすめられている。
  • オブジェクトファイル依存いぞんした機能きのう
    • コンパイラが通常つうじょう使用しようしないセクションとうにシンボルを定義ていぎすることができる。れいとして、Linuxカーネルではモジュール公開こうかいするシンボルをマクロEXPORT_SYMBOL(ないしはその派生はせい[43]あたえる。このマクロは、インラインアセンブリをもちいてオブジェクトファイルのセクション.export_symbolへシンボルの情報じょうほう追加ついかし、モジュールローダがシンボル解決かいけつにて使用しようできるようにする。マクロの内容ないようはCPUアーキテクチャには依存いぞんせず、その定義ていぎもCPUアーキテクチャに依存いぞんしないヘッダファイル(include/linux/export.h[ちゅう 3]にあるが、C言語げんごふく高級こうきゅう言語げんごのみでの実装じっそうむずかしく、アセンブリがてきしている。[ちゅう 4]

なお一方いっぽうで、最近さいきん[いつ?]のコンピュータの命令めいれいセットはそのおおくはどれもている。したがって、どれか1つのアセンブリ言語げんごまなぶだけで、基本きほん概念がいねん、どんなときにアセンブリ言語げんご使用しようするのがてきしているか、高水準こうすいじゅん言語げんごから効率こうりつてき実行じっこうコードを生成せいせいする方法ほうほうをある程度ていど学習がくしゅうできる[44]

高水準こうすいじゅん言語げんごとの連携れんけい

[編集へんしゅう]
  • 高水準こうすいじゅん言語げんご処理しょりけい呼出よびだし規約きやく言語げんご処理しょりけいではなくOSやハードウェアベンダがわ共通きょうつうしている場合ばあいもある)にしたがうことで、高水準こうすいじゅん言語げんご相互そうごにコードをすことができる。後述こうじゅつインラインアセンブラなどにより同一どういつのモジュールにむこともできれば、べつモジュールとしてリンケージエディタでリンクすることもある。
  • おおくのコンパイラは、機械きかい直接ちょくせつ生成せいせいするのではなく、アセンブリ言語げんごのコードを生成せいせいし、それをアセンブラにとおしている。人間にんげんによるデバッグ最適さいてきなどに便利べんりである(機械きかいによる最適さいてきには、内部ないぶ表現ひょうげん使つかったほうが便利べんりなので、あまり意味いみがない)。その意味いみではアセンブリ言語げんごは、えないかたちではあるがもっと利用りよう頻度ひんどたかいプログラミング言語げんごといえるという主張しゅちょうもあるが、その意味いみでは機械きかい絶対ぜったいてきもっと利用りよう頻度ひんどたかいプログラミング言語げんごである。
  • インラインアセンブラのある言語げんごないし処理しょりけいでは、ソースちゅうにアセンブリ言語げんごによる記述きじゅつふくめることができる。たとえばLinuxカーネルではその利用りようおおい。アセンブリ言語げんご同様どうよう利点りてんられるかわりに、やはりアセンブリ言語げんご同様どうようにプログラミング言語げんご使つか利点りてん移植いしょくせいなど)がうしなわれる。

脚注きゃくちゅう

[編集へんしゅう]

注釈ちゅうしゃく

[編集へんしゅう]
  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にち閲覧えつらん

参考さんこう文献ぶんけん

[編集へんしゅう]
  • Jonathan Bartlett: Programming from the Ground Up. Bartlett Publishing, 2004. ISBN 0-9752838-4-7
    Also available online as PDF. 2024ねん3がつ20日はつか閲覧えつらん
  • Robert Britton: MIPS Assembly Language Programming. Prentice Hall, 2003. ISBN 0-13-142044-5
  • Paul Carter: PC Assembly Language. Free ebook, 2001.
    Website
  • Jeff Duntemann: Assembly Language Step-by-Step. Wiley, 2000. ISBN 0-471-37523-3
  • Randall Hyde: The Art of Assembly Language. No Starch Press, 2003. ISBN 1-886411-97-2
  • Peter Norton, John Socha, Peter Norton's Assembly Language Book for the IBM PC, Brady Books, NY: 1986.
  • Michael Singer, PDP-11. Assembler Language Programming and Machine Organization, John Wiley & Sons, NY: 1980.
  • Dominic Sweetman: See MIPS Run. Morgan Kaufmann Publishers, 1999. ISBN 1-55860-410-3
  • John Waldron: Introduction to RISC Assembly Language Programming. Addison Wesley, 1998. ISBN 0-201-39828-1

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]