私たちは主に高レベル言語でプログラムを書きます。それで勉強しながらアセンブリ言語に出会いました。したがって、アセンブラーはアセンブリー言語を機械語に変換し、コンパイラーは高水準言語でも同じことを行います。アセンブリ言語には、move r1 r3、move a 5などの指示があります。勉強するのはかなり難しいです。では、なぜアセンブリ言語が作成されたのでしょうか?コンピューター工学のクラスでアセンブラーについて勉強するのはなぜですか?
私たちは主に高レベル言語でプログラムを書きます。それで勉強しながらアセンブリ言語に出会いました。したがって、アセンブラーはアセンブリー言語を機械語に変換し、コンパイラーは高水準言語でも同じことを行います。アセンブリ言語には、move r1 r3、move a 5などの指示があります。勉強するのはかなり難しいです。では、なぜアセンブリ言語が作成されたのでしょうか?コンピューター工学のクラスでアセンブラーについて勉強するのはなぜですか?
回答:
「では、なぜアセンブリ言語が作成されたのですか?」
アセンブリ言語は、マシンレベルのコーディングの正確な省略形として作成されたため、1日中0と1をカウントする必要はありません。マシンレベルのコードと同じように機能します。命令とオペランドを使用します。
「どちらが先に来ましたか?」
ウィキペディアには、プログラミング言語の歴史に関する良い記事があります
「コンピューターエンジニアリングクラスでアセンブラーについて勉強しているのはなぜですか?」
確かに、アセンブリで次の顧客のアプリを作成することはないでしょう。アセンブリを学習することで得られることはまだたくさんあります。
現在、アセンブリ言語は、主に直接ハードウェア操作、特殊なプロセッサ命令へのアクセス、または重大なパフォーマンスの問題に対処するために使用されています。典型的な用途は、デバイスドライバー、低レベルの組み込みシステム、およびリアルタイムシステムです。
アセンブリ言語はプログラマーと同じくらいプロセッサに近いため、適切に設計されたアルゴリズムが非常に優れています。アセンブリは速度の最適化に最適です。パフォーマンスと効率がすべてです。アセンブリ言語を使用すると、システムのリソースを完全に制御できます。アセンブリラインと同様に、単一の値をレジスタにプッシュし、メモリアドレスを直接処理して値またはポインターを取得するコードを記述します。(ソース:codeproject.com)
アセンブリ言語が必要なのはなぜですか?
実際、必要な言語は「機械語」または「機械コード」という1つだけです。次のようになります。
0010000100100011
これは、コンピューターが直接話すことができる唯一の言語です。これは、CPUが話す言語です(技術的には、さまざまな種類のCPUがさまざまなバージョンを話します)。見て理解しようとするのも嫌です。
幸いなことに、バイナリの各セクションは特定の意味に対応しています。それはいくつかのセクションに分かれています:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
これらの値は次のものに対応します。
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
したがって、この操作はレジスタ1および2に数値を追加し、その値をレジスタ3に入れます。これらの値を文字通りCPUに入れて「実行」すると、2つの数値が追加されます。操作「減算」は、ここでは0010の代わりに0011または何かにすることができます。どのような値でも、CPUは減算を実行します。
したがって、プログラムは次のようになります(物事を説明するためにこの特定のバージョンのマシンコードを作成したため、理解しようとしないでください)。
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
これは読みにくいですか?間違いなく。ただし、CPUには必要です。まあ、すべてのマシンコードが特定のアクションに対応している場合、単純な「英語」の速記を作成し、プログラムが何をしているのかを理解したら、それを実際のバイナリマシンコードに変換し、CPUに渡して実行します。
したがって、上記の元の命令は次のようになります。
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
この英語版にはマシンコードへの正確なマッピングがあります。したがって、この「英語」の行を書くとき、私たちは実際に、より友好的でより理解しやすいマシンコードを書いているだけです。
まあ、これはアセンブリ言語です。それが存在する理由であり、元々作成された理由です。
今なぜそれが必要なのかを理解するには、上記の答えを読んでください。しかし、理解する鍵はこれです。高レベル言語には単一の表現がないのはマシンコードです。たとえば、C、Python、または何でも:
z = x + y
これx
は、レジスター1にy
あり、レジスター2にあり、レジスター3にあると仮定して、上から追加したように聞こえz
ます。しかし、この行はどうでしょうか。
z = x * 2 + (y / 6) * p + q - r
その行をバイナリの16ビットで表現し、CPUに「実行」を伝えてみてください。できません。機械語コードには、加算、減算、および4つまたは5つの変数を一度に実行するための単一の演算命令はありません。そのため、最初に一連のマシンコードに変換する必要があります。これは、高水準言語を「コンパイル」または「解釈」するときに行うことです。
さて、私たちはそれを行うプログラムを持っているのに、なぜ今アセンブリが必要なのでしょうか?プログラムの実行速度が予想よりも遅いため、その理由を知りたいと言ってください。この行の機械語「出力」を見ると、次のようになります。
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
Pythonの1行を完成させるためだけです。あなたは本当にそれをデバッグしたいのですか?!?!?!いいえ。むしろ、実際に簡単に理解できる形式で出力を親切に提供するようコンパイラーに依頼します。これは、そのマシンコードに正確に対応するアセンブリ言語バージョンです。次に、コンパイラーが何かおかしいことをしているかどうかを把握し、修正を試みます。
(@Raphaelのアドバイスに関する追加のメモ:実際には、3進(基数3)または10進コード、さらにはASCIIのようなバイナリコード以外のもので動作するCPUを構築できます。
では、なぜアセンブリ言語が作成されたのですか?それとも、高級言語よりも前に最初に来たのですか?
はい、アセンブリは、ワイヤをはんだ付けしたり、プラグボードを使用したり、スイッチを反転したりするのではなく、テキストを入力として使用した最初のプログラミング言語の1つでした。各アセンブリ言語は、プロセッサによって実行されるオペコードに直接マップされた命令として、1つのプロセッサまたはプロセッサファミリ用に作成されました。
コンピューター工学のクラスでアセンブラーについて勉強するのはなぜですか?
デバイスドライバーのプログラミングやコンパイラーの作成が必要な場合、必要に応じてプロセッサーの動作を理解することは非常に重要です。これを理解する最善の方法は、アセンブリでコードを書くことです。
コンパイラがどのようにコードを書くかを見ると、アセンブリを知らないとおそらく理解できない呼び出し規約のオプションがよく見られます。
バグを解決する必要があり、唯一の入力がコアダンプである場合、アセンブリコードである出力を理解するためにアセンブリを知っている必要があります。
少し実用的な側面を追加しましょう。これは(おそらく)歴史的な理由ではなく、今日のあなたの理由です。
アセンブリー(高水準言語と比較して)は裸です。(ソフトウェアで行われる)何も隠しません。また、比較的小さな固定された操作セットがあるという意味で単純です。
これは、正確なアルゴリズム分析に役立ちます。セマンティクスと制御フローは非常に単純なので、制御フローグラフに遷移カウント(確率)で注釈を付けることで、すべての操作(または予想される数)をカウントできます。KnuthはTAoCPの本でこれを非常に効果的に行っており、最も厳密なアルゴリズム分析のいくつかを示しています。
逸話:私の同僚は、まさにこの目的のためにJavaバイトコードを読むことを学びました。
ここに答えがあります:
アセンブリ言語を学習する理由 ゲーリー・L・バート
これらの答えはすべて次のものを指します。
アセンブリ=マシンコード
一部の人々は、アセンブリ言語がCPUが理解する数値コードとどのように異なるかについてよく考えています。
これは(本当ではあるが)完全にポイントを見逃している。
翻訳に関しては、アセンブリ言語と数値(2進数、16進数)はまったく同じものです。
それをグロックまたはドロップする
アセンブリをグロックすると、実際のコンピューターの動作がわかります。
grokkingアセンブリには以下が含まれます。
multiscalar
意味 アセンブリを調べると、キーボードに接続されたCPUがどのように機能するかをほぼ完全に把握できます。
脳外科医がメスを使用するように、この知識を使用する必要があります。
悪臭を放つ抽象化を必要としない
アセンブリ(したがって手術台のCPU)を理解しない限り、RAMマシンの抽象化(または神がチューリングマシンに恐怖を禁じる神)から解放されることはありません。
L33t Hax0r 5k1llz
アセンブリは、133thax0rが保護スキームを無効にする方法を理解するのにも役立ちます。(Q:なぜASLRない仕事ない?のでmov rax,fs:[28h]
休憩それを)。
0.1%
重要なのはアセンブリの知識ではなく、作業中のマシンの知識です。
マシンを知りたい場合は、それを理解する必要があります。つまり、マシンの言語を話す必要があります。
そうしないと、抽象化に悩まされます。
それは科学であり、それは良いことですが、それは決して完全な状況ではありません。
それは話すことを学ぶようなものだコーサを
あなたは教祖のレベルを目指していない限り、あなたが知っているとの最高のスティック、これらのクリックは、あなたの人生を複雑にします。
楽しいからです。
私自身は、IBM System 32を使用して最初にRPG IIを学び、その後370でAPLを学びました。サイズと速度がすべてでした。私のマントラは小さくて速くなりました。アセンブリは、最もコンパクトで最速の言語です。Cとアセンブリの両方でテストプログラムを作成します。Cプログラムが数百Kbを必要とする場合、同等のアセンブリプログラムは多くの場合5 Kb未満です。Cコンパイラの出力を調べると、パラメータをチェックして再チェックするコードがあり、非常にまれでエキゾチックで非常に不要な可能性のあるエラーの条件付きチェックを行います。スタックとの間。
今日のプログラミング環境では、コードを記述すると、セキュリティと保護のレベルがさらに向上します。高レベル言語にアクセスできないハードウェアから情報を直接読み取ることができるため、プログラムをその特定のマシンでのみ使用できるようにアセンブリで暗号化できます。たとえば、ネットワークインターフェイスのMACアドレスを使用してユーザーキーを暗号化し、そのキーをハードドライブの特定の未登録セクターに駐車してから、セクターを不良としてマークし、他のファイルが上書きできないようにします。もちろんセクターを失いますが、それは何ですか?数十億兆から2048バイトまたは4096バイト?