「第2回エンペディア大賞」が2月いっぱい開催中です。2024年に作成された記事の中から、お気に入りの記事に投票しましょう!
アセンブラ
アセンブラとは、アセンブルを行うソフトウェアである。そして、アセンブルとは、アセンブリ言語で書かれたプログラムから機械語で書かれたオブジェクトコードへの変換である。
概要[編集]
- アセンブルは比較的単純な規則からなるため、人の手でも実行でき、これは、「ハンドアセンブル」と呼ばれるが、単純な作業を効率良くミス無く行うのはプログラムの得意分野であるため、そのためのソフトウェア(アセンブラ)が開発された。
- 機械語のアセンブリ言語化をおこなうプログラムは逆アセンブラである。
- シンボル名による参照の利用はアセンブラの重要な機能であり、プログラム修正などに伴うアドレスの更新の手間を省くことができる。
分類[編集]
クロスアセンブラ[編集]
アセンブリ言語で作成したプログラムを、異なる実行環境で動作する機械語に翻訳するアセンブラ
ワンパスアセンブラ[編集]
プログラムをを1回だけパスするアセンブラ。
マルチパスアセンブラ[編集]
最初のパスで全シンボルとその値の表を作成し、その表を使ってその後のパスで機械語のオブジェクトコードを生成する。
その他[編集]
これは1編集者の私見。(編集者:User:早朝の掃除屋さん)
ターゲットマシンのアーキテクチャによりアセンブリ言語にはバリエーションがあるため、「アセンブラのソースコード」を(機能拡張を含む)保守することが面倒になってきて、訳がわからなくなることも(アマチュアプログラマの間では)あった[注 1]。
歴史的には、ギリシャ神話の記憶の女神ムネモネス(ムネモシュネ、あるいはムネーモシュネー)の名から取ったCPUの命令語と数字列を、機械語(マシン語、マシンコード、オブジェクトコード)に変換しコンピューターが実行可能な形式のデータに変換する。つまり、「アセンブリ言語のソースコード⇒実行可能なマシンコード」という機能を担った、ある種の翻訳系であり、アプリケーション・プログラムの一種であった。
当初のこマシンはパネルの表面にトグルスイッチが二段に渡って並んでおり、アドレスとその内容を表すディスプレイがあり、「書込み」ボタンがあるという単純なものであった。これを言語としては「オンオフ」といい、紙テープに保存するのが通例であった[注 2]。その後、「二進数で丸暗記するのはまともな人間のすることではない」というので[注 3]ニモニックが誕生した。そのニモニック・コードをバイナリに(手作業で)落とすことを「ハンド・アセンブル」と呼ぶ。
このアセンブル作業をコンピュータ自身に行わせようので開発されたのが、アセンブラである。
アセンブラに入力されるのは穿孔された紙テープであり、出力も紙テープであった。そのため、「頭から尻尾まで」という処理の順序があった。このとき、「すでに読み終わった部分」を「後方」、「これから読む部分」を「前方」と呼ぶ。当初のアセンブラでは前方参照は原則的には使えなかった。そこで「同じテープを二度通す」という「2 パスアセンブラ」とか「べつにターゲットマシンとアセンブラを動かすマシンは同じでなくてもいいんじゃねぇ?」というので記憶領域の広いマシンでアセンブラを動かすクロスアセンブラが登場したりした。
そののち「機械語から元のソースを発掘する」という「逆アセンブラ」なるものが登場し、「どうもアセンブラの動作が異様に重い」というのでアセンブラのコードを掘っていたら「中から仮想マシンが発掘された」という話もある。
また、アドレスの参照には飛び先のアドレスをリテラル値で指定する「直接ジャンプ」、相対位置を使う「関節ジャンプ」と「指定されたアドレスに飛び先のアドレスが入っているからそれを使え」という「間接ジャンプ」があり、「生成されたバイナリーコードを実メモリのどこに置いてもよい」というアロケーション・フリーのプログラムをどうするかというので「リンカ」のお世話になったりとかマクロのライブラリを参照するだのマクロ展開をするだのといった話も出てくるようになった。
そうして現在のアセンブラ環境が動いているのである。
脚注[編集]
注釈[編集]
- ↑ このため、この関係を説明するために「マッキーマン図」というものがかつて用いられたが、古すぎてネット検索に引っかからず、自分のWebLogが出てくるのだからなさけない。要はコードを〇、処理系を□、翻訳系を「T字形」を太くした「凸」を上下反転したような形を(向かって左から右へ)描いて表現した図形である。□は縦にも積めて、JVMの上にJavaのオブジェクトが乗ったりもする。
- ↑ 「現物の紙テープを見かけたのは四十年以上昔の航空自衛隊入間基地にあるFADP(飛行管理隊)くらいだ」そうなので、辛うじて博物館に収蔵されているかもしれない。
- ↑ シーモア・クレイはクレイIのイニシャルコードを丸暗記していたというが。