web-dev-qa-db-ja.com

最初のアセンブラはマシンコードで書かれたのですか?

私は本を​​読んでいます コンピューティングシステムの要素:第一原理から現代のコンピューターを構築する 、これにはブールゲートから高レベルのアプリケーションまで(この順序で)コンピューターの構築を網羅するプロジェクトが含まれています。現在取り組んでいるプロジェクトは、選択した高水準言語を使用してアセンブラーを作成し、Hack AssemblyコードからHackマシンコードに変換することです(Hackは、前の章で作成したハードウェアプラットフォームの名前です)。ハードウェアはすべてシミュレータで構築されていますが、実際のプロセスのその時点で使用可能なツールのみを使用して、各レベルを実際に構築しているように見せかけました。

とはいえ、考えさせられました。私のアセンブラーを記述するために高水準言語を使用することは確かに便利ですが、これまでに作成された(つまり、歴史上)初めてのアセンブラーの場合、それは当時存在していたすべてなので、マシンコードで記述する必要はないでしょうか?

そして関連する質問...今日はどうですか?まったく新しい命令セットとまったく新しいアセンブリ構文を備えたまったく新しいCPUアーキテクチャが登場した場合、アセンブラはどのように構築されますか?アセンブラプログラムのバイナリを生成するために、既存の高水準言語を引き続き使用できると思います。新しいプラットフォームのアセンブリ言語と機械語の両方の構文を知っている場合、アセンブラを作成するタスクは、実際には単なるテキスト分析タスクであり、そのプラットフォームに本質的に関連していない(つまり、そのプラットフォームのマシン言語で記述する必要がある)...これが、2012年にHackアセンブラーを作成しているときに「チート」し、既存の私を助けるための高級言語。

43
The111

これまでに作成された(つまり、歴史上)初めてのアセンブラーの場合、マシンコードで作成する必要はありませんか?

必ずしも。もちろん、アセンブラの最初のバージョンv0.00はマシンコードで記述されている必要がありますが、アセンブラと呼ばれるほど強力ではありません。 「実際の」アセンブラの半分の機能もサポートしませんが、それ自体の次のバージョンを作成するには十分です。次に、アセンブリ言語のサブセットでv0.00を書き換えてv0.01と呼び、それを使用してアセンブラーv0.02の次の機能セットをビルドし、次にv0.02を使用してv0.03をビルドします。以降、v1.00に到達するまで。その結果、最初のバージョンのみがマシンコードになります。最初のreleasedバージョンはアセンブリ言語になります。

このトリックを使用して、テンプレート言語コンパイラの開発をブートストラップしました。私の最初のバージョンはprintfステートメントを使用していましたが、私の会社で使用する最初のバージョンは、それが処理していたテンプレートプロセッサそのものを使用していました。ブートストラップフェーズは4時間未満で終了しました。私のプロセッサーがほとんど役に立たない出力を生成できるとすぐに、私はそれを独自の言語で書き直し、コンパイルして、非テンプレートバージョンを破棄しました。

38
dasblinkenlight

ウィキペディアによると、最初のアセンブラー/アセンブリー言語は Nathaniel Rochester によってIBM 701に実装されました。 (日付はウィキペディアの記事からは少し不確かです。ロチェスターは1948年にIBMに加わったと述べていますが、別のウィキペディアのページでは701が1952年に公に発表されたと述べています。そして このIBMページ は- "[a]実際の設計は1951年2月1日に始まり、1年後に完成しました"。)

ただし、 David Salomon による「アセンブラーとローダー」は、EDSACにもアセンブラーがあることを示しています(7ページ)。

"最初に保存されたプログラムコンピュータの1つは、ケンブリッジ大学で1949年にモーリスウィルクスとW.レンウィックによって開発されたEDSAC(電子遅延ストレージ自動計算機)でした。EDSACはその最初の日から、初期注文と呼ばれるアセンブラを備えていました。 。一連の回転式電話セレクタで構成される読み取り専用メモリに実装され、シンボリックな命令を受け入れました。各命令は、1文字のニーモニック、10進数のアドレス、および文字である3番目のフィールドで構成されていました。3番目のフィールドプログラマーによって事前設定された12個の定数の1つがアセンブリ時にアドレスに追加される原因となりました。 "(参照は省略されました...オリジナルを参照してください。)

「初期注文」が優先されることを受け入れると仮定すると、最初のアセンブラーwasがマシンコードに実装されていることの明確な証拠があります。

このパターン(最初のアセンブラーをマシンコードで記述する)は、1950年代までは標準でした。しかし、 Wikipedia によると、「[a] ssemblersはbootstrap自身」への最初の言語ツールでした。参照してください このセクション 説明原始的なアセンブラーで記述されたマシンコードをどのように使用したかbootstrapアセンブリ言語でコーディングされたより高度なアセンブラー。

最近のアセンブラーとコンパイラーは高水準言語で書かれており、新しいマシンアーキテクチャー用のアセンブラーまたはコンパイラーは、通常、異なるアーキテクチャーで開発され、クロスコンパイルされます。

(FWIW-自明ではないプログラムをマシンコードで記述してデバッグするのは非常に骨の折れるプロセスです。アセンブラをマシンコードで開発している人は、おそらくbootstrapアセンブラで記述されたアセンブラにできるだけ早くなります。 )

ブートストラップコンパイラとアセンブラ に関するこのWikipediaのページは、読む価値があります...これがすべて不可解な場合です。

25
Stephen C

最初のアセンブラはマシンコードで記述されたと思います。なぜなら、あなたが言うように、当時は他に何も利用できなかったからです。

ただし、今日では、まったく新しいCPUアーキテクチャが出てきたときに、 a Cross-Compiler と呼ばれるものを使用しています。これは、実行しているアーキテクチャ用ではないマシンコードを生成するコンパイラですが、別のアーキテクチャ用。

(実際のところ、あなたが読んでいる本で後でわかると思いますが、コンパイラーを実行しているアーキテクチャー用のマシンコードを生成するためにコンパイラーを本質的に適切にするものは何もありません他のアーキテクチャーです。コンパイラーの作成者として、どのアーキテクチャーをターゲットにするかは問題です。)

したがって、今日では、少なくとも理論的には、まったく新しいアーキテクチャを作成し、そのアーキテクチャのアセンブラを用意する前に、その上でネイティブに実行される高水準言語コンパイラ(クロスコンパイラを使用して他のアーキテクチャでコンパイル)を作成することも可能です。

14
Mike Nakis

最初に「アセンブリ」は紙に書かれ、次に手作業でパンチカードに「コンパイル」されました。

私の祖父は ZRA1 で作業していました(申し訳ありませんが、ページはドイツ語でのみ存在しますが、Googleの翻訳は、実際に最も重要な事実をピックアップできるところまで問題ありません:D)。
手口はコードを紙にアセンブリ言語のようなもので書き留めることでした、そして、秘書は実際にカードをパンチするために文字起こしをして、それをオペレーターに渡し、結果は翌朝返されます。 。

これは基本的に、プログラマーがキーボードからデータを入力して画面に表示するという贅沢ができる前のことでした。

12
back2dos

veryの最初のアセンブラーを特定することは困難です(それが何であったかを定義することさえ困難です)。数年前、アセンブラのないマシン用にいくつかのアセンブラを書いたとき、私はまだアセンブリ言語でコードを書いていました。次に、コードのセクションが適切に完成した後、手作業でマシンコードに変換しました。これらはまだ2つの完全に別のフェーズでしたが、コードを書いているときは、マシンコードレベルで作業したり考えたりしていませんでした。

私はそれをいくつか追加する必要があります、私はさらに一歩進んだ:私はコードのほとんどを使用する方が簡単だと思うアセンブリ言語で書いて、それから小さなカーネル(多かれ少なかれ現在仮想マシンと呼ぶもの)を書いた。ターゲットプロセッサでそれを解釈する。これは非常に遅い(特に1 MHz、8ビットプロセッサでは)が、通常は1回しか実行されなかった(または多くても数回)ので、それほど問題ではなかった。

9
Jerry Coffin

アセンブリ言語コードをマシンコードに手動でアセンブルするためのアセンブラは必要ありません。アセンブリ言語コードを記述するためにエディターが必要ないのと同じように。

歴史的展望

最初のアセンブラはおそらくアセンブリ言語で記述され、その後機械コードに手動でアセンブルされました。プロセッサに公式の「アセンブリ言語」がなかったとしても、プログラマーはおそらく、そのコードを機械語命令に変換する前に、ある種の疑似コードを使用してプログラミングのほとんどの仕事をしたでしょう。

コンピューティングの最初の日 でさえ、プログラマーは一種の 記号表記 でプログラムを記述し、それをマシンコードに変換しました。それを彼らのコンピューターに送り込む。オーガスタエイダキングの場合、彼女はそれらを パンチされたカードBabbage分析エンジン に変換する必要がありましたが、残念ながらそれは構築されませんでした。

個人的体験

私が最初に所有したコンピュータは Sinclair ZX81 (米国ではTimex 1000)でした。マニュアルの裏側には、Z80アセンブリ言語をマシンコードに変換するために必要なすべての情報が含まれていました(奇妙なインデックスモード opcodes Z80が持っていたものもすべて含みます)。

私はプログラムを(紙に)アセンブリ言語で記述し、コードを実行します。私のプログラムにバグがなかったことに満足したとき、私はマニュアルの裏で各命令を調べ、それをマシンコードに変換し、マシンコードも紙に書き留めました。最後に、テープに保存して実行する前に、すべてのマシンコード命令をZX81に入力します。

それが機能しない場合は、手でアセンブリを再確認し、変換が間違っている場合は、テープからロードされたバイトにパッチを適用してから、再保存してプログラムの実行を再試行します。

経験から、コードがマシンコードよりもアセンブリ言語で記述されている場合、コードをデバッグする方がはるかに簡単であることがわかります。そのため、逆アセンブラの人気が高まっています。アセンブラがない場合でも、手動で機械コードを記述しようとするよりも、手で組み立てるほうがエラーが発生しにくくなります。ただし、 実際のプログラマ のように Mel はそう思わないかもしれません。 * 8 ')

8
Mark Booth

その時も今も違いはありません。新しいプログラミング言語を発明したい場合は、最初に利用できる言語を選択して、最初のコンパイラを作成します。ある期間にわたって、それがプロジェクトの目標である場合は、その言語でコンパイラーを作成すると、自己ホストすることができます。

鉛筆と紙、および最初のまたは次の新しい命令セットへのユーザーインターフェイスとしていくつかのスイッチまたはパンチカードしかなかった場合、使用可能なアイテムの1つまたはすべてを使用しました。あなたはアセンブリ言語を紙に書いて、それからアセンブラを使ってそれをマシンコードに、おそらく8進数に変換し、その後、ある時点でマシンへのインターフェースに入ったはずです。

今日、まったく新しい命令セットが発明された場合、会社/個人、慣習などに応じて、ハードウェアエンジニアがおそらくverilogまたはvhdlでプログラミングしていて、最初のいくつかのテストプログラムを手動でマシンコードに書き込んでいる可能性が高いです。 (おそらく16進数または2進数)。ソフトウェアチームの進捗状況によっては、アセンブリ言語に切り替えてからコンパイラに切り替えて、非常に迅速に行うこともあれば、そうでない場合もあります。

最初のコンピューティングマシンは、アセンブラやコンパイラの作成に使用できる汎用マシンではありませんでした。前のALUの出力と次のALUの入力との間のいくつかのワイヤーを移動することにより、それらをプログラムしました。結局、Assemblyでアセンブラーを記述し、それを手動でアセンブルし、それをマシンコードとしてフィードし、それを使用してebcdic、asciiなどを解析し、その後セルフホストすることができるような汎用プロセッサーがありました。バイナリを一部のメディアに保存し、後でスイッチを切り替えて、手差し機械のコードに切り替え続ける必要がないメディアを読み込みます。

パンチカードと紙テープを考えてください。スイッチを切り替える代わりに、コンピューターが読み取るメディアを作成する完全に機械的な機械、つまり省力化装置を作ることができます。 Altairのようなスイッチでマシンコードビットを入力する代わりに、紙テープまたはパンチカードを供給することができます(プロセッサーまたはドライブではなく、機械式のものを使用して、メモリまたはプロセッサーに供給します)OR usingブートローダーで記述された小さなマシンコードです。コンピューターで駆動して紙テープやパンチカードを機械的に生成し、それらをフィードバックできるものを作成できるため、これは悪い考えではありませんでした。パンチカードの2つのソース、非コンピュータベースの機械式省力化装置とコンピュータ駆動の機械の両方が、コンピュータの「バイナリ」を生成します。

5
old_timer

Brookのインスタンスには1つまたは2つのインスタンスがありますcomputer Zoo「ニーモニックは私たちの発明であり、デザイナーは単に数値のオペコードまたはコードがオペコードである文字を使用した」ので、アセンブリ言語すらありませんでした。

プログラムを入力すると、フロントパネルでデバッグが終了します(まだ行っていない場合は、メモリをセットアップする方法でした。アドレスにいくつかのスイッチを設定し、値に他のスイッチを設定して、ボタンまたは別のボタンを押すと、値を読み取る)はずっと後で一般的でした。一部の古いタイマーは、広範囲に使用したマシンのブートコードを入力できることを自慢しています。

マシンコードを直接書き込んだり、メモリダンプからプログラムを読み取ったりすることの難しさは、マシン言語に大きく依存します。それらの一部は比較的簡単です(最も難しい部分はアドレスの追跡です)。x86は悪いものの1つです。

4
AProgrammer

私は1975年にコンピューターを構築しました。16進数でマシンコードを入力してビデオモニターでこのコードを表示することでプログラムに入ることができる「モニターrom」を備えていたため、それは現代のAltairよりも非常に高度でした。 Altairの各機械語命令は、スイッチの列を使用して少しずつ入力する必要がありました。

そう、そうです、コンピュータの初期の頃、そしてパーソナルコンピュータの初期の頃にも、人々はアプリケーションをマシンコードで記述していました。

2
Jim In Texas

逸話:

アセンブリ言語を学んだとき、Apple] [で、ROMマイクロアセンブラと呼ばれるプログラムが含まれていました。それはアセンブリの即時翻訳を行いました入力したバイトへの命令。これは、ラベルがないことを意味します。ジャンプまたはロードする場合は、オフセットを自分で計算する必要がありました。ただし、命令のレイアウトを調べて16進値を入力するよりもはるかに簡単でした。

間違いなく、実際のアセンブラは、最初はマイクロアセンブラまたはその他の完全ではない環境を使用して作成されました。

2
Sean McMillan