アセンブリ言語が必要なのはなぜですか?


27

私たちは主に高レベル言語でプログラムを書きます。それで勉強しながらアセンブリ言語に出会いました。したがって、アセンブラーはアセンブリー言語を機械語に変換し、コンパイラーは高水準言語でも同じことを行います。アセンブリ言語には、move r1 r3、move a 5などの指示があります。勉強するのはかなり難しいです。では、なぜアセンブリ言語が作成されたのでしょうか?コンピューター工学のクラスでアセンブラーについて勉強するのはなぜですか?


13
アセンブラーは人間が読み取れるマシンコードです。そのためです。
アンドレイバウアー

4
なぜなら、私たちがハードウェアに近いときに物事がどのように機能するかを知ることが重要だからです。アセンブリを記述するとき、コンピューターのハードウェアが低レベルでどのように機能し機能するかを理解します。そのための最良の方法はアセンブリ言語です。機械言語は退屈で、アセンブリのように読み込めないためです。あなたは本当に魔法の箱を使って、中を決して見たくないのですか?
スペンサーヴィエゾレック14

回答:


32

「では、なぜアセンブリ言語が作成されたのですか?」

アセンブリ言語は、マシンレベルのコーディングの正確な省略形として作成されたため、1日中0と1をカウントする必要はありません。マシンレベルのコードと同じように機能します。命令とオペランドを使用します。

「どちらが先に来ましたか?」

ウィキペディアには、プログラミング言語の歴史に関する良い記事があります

「コンピューターエンジニアリングクラスでアセンブラーについて勉強しているのはなぜですか?」

確かに、アセンブリで次の顧客のアプリを作成することはないでしょう。アセンブリを学習することで得られることはまだたくさんあります。

現在、アセンブリ言語は、主に直接ハードウェア操作、特殊なプロセッサ命令へのアクセス、または重大なパフォーマンスの問題に対処するために使用されています。典型的な用途は、デバイスドライバー、低レベルの組み込みシステム、およびリアルタイムシステムです。

アセンブリ言語はプログラマーと同じくらいプロセッサに近いため、適切に設計されたアルゴリズムが非常に優れています。アセンブリは速度の最適化に最適です。パフォーマンスと効率がすべてです。アセンブリ言語を使用すると、システムのリソースを完全に制御できます。アセンブリラインと同様に、単一の値をレジスタにプッシュし、メモリアドレスを直接処理して値またはポインターを取得するコードを記述します。(ソース:codeproject.com


29

アセンブリ言語が必要なのはなぜですか?

実際、必要な言語は「機械語」または「機械コード」という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を構築できます。


2
原則として、アセンブリ言語で直接動作するCPUの構築を妨げるものは何もありません。ASCIIは、この目的のための単なる非効率的なエンコーディングです。それだけです。
ラファエル

追加していただきありがとうございます。私は同意しますが、アセンブリの目的を理解するためにそれをスキップしました。メモを追加します。
クリスクーパー14

15

では、なぜアセンブリ言語が作成されたのですか?それとも、高級言語よりも前に最初に来たのですか?

はい、アセンブリは、ワイヤをはんだ付けしたり、プラグボードを使用したり、スイッチを反転したりするのではなく、テキストを入力として使用した最初のプログラミング言語の1つでした。各アセンブリ言語は、プロセッサによって実行されるオペコードに直接マップされた命令として、1つのプロセッサまたはプロセッサフ​​ァミリ用に作成されました。

コンピューター工学のクラスでアセンブラーについて勉強するのはなぜですか?

デバイスドライバーのプログラミングやコンパイラーの作成が必要な場合、必要に応じてプロセッサーの動作を理解することは非常に重要です。これを理解する最善の方法は、アセンブリでコードを書くことです。

コンパイラがどのようにコードを書くかを見ると、アセンブリを知らないとおそらく理解できない呼び出し規約のオプションがよく見られます。

バグを解決する必要があり、唯一の入力がコアダンプである場合、アセンブリコードである出力を理解するためにアセンブリを知っている必要があります。


14

少し実用的な側面を追加しましょう。これは(おそらく)歴史的な理由ではなく、今日のあなたの理由です。

アセンブリー(高水準言語と比較して)はです。(ソフトウェアで行われる)何も隠しません。また、比較的小さな固定された操作セットがあるという意味で単純です。

これは、正確なアルゴリズム分析に役立ちます。セマンティクスと制御フローは非常に単純なので、制御フローグラフに遷移カウント(確率)で注釈を付けることで、すべての操作(または予想される数)をカウントできます。KnuthはTAoCPの本でこれを非常に効果的に行っており、最も厳密なアルゴリズム分析のいくつかを示しています。

逸話:私の同僚は、まさにこの目的のためにJavaバイトコードを読むことを学びました。


4

ここに答えがあります:

これらの答えはすべて次のものを指します。

  • 速度/メモリの最適化
  • 機械の仕組みを理解する
  • Noobプログラマーはエキスパートになる
  • アセンブリを知っていれば、High Lvl言語用のコンパイラの作成方法を知っています。

1
これらすべての意見を共有していますか?あなたの経験は?(特に、「So Noob Programmers Experts」という項目は、数十年前には時代遅れに思えます。)
ラファエル

あなたはこのテーマについてそれほど気にする必要はありません。私は彼の重複した質問に答えをリンクしています。そして、「So Noob ProgrammersはExpertsになりました」がここで最も高く評価されました。私ではなく彼と議論する=)
compski

1
私は気楽ではありません、あなたがあなたの答えを良いものにするのを助けようとしています(現在、あなたはいくつかのリソースにリンクしているだけなので、どれも完全に質問に答えません)。比較のために自分の考えを含めることは、そのための第一歩です。(意見を除外する方法で意見を関連付けることにより、あなたは彼らに価値を割り当てることに注意してください。言い換えれば、あなたは意見を(再)投稿するのに十分である理由を議論する必要があります。)
ラファエル

私の経験では、高度なプログラミング言語に慣れただけで、アセンブリ言語の学習に苦労しています。そして、私は、優れたプログラマーであるか、事前にC ++ / CがASMでかなりよくプログラミングできることを知っています。私の意見が私の答えに掲載されるほど価値があるとは思わなかったので、その理由は…
-compski

最初のリンクが壊れています。
Hola Soy Edu Feliz Navidad

1

アセンブリ=マシンコード
一部の人々は、アセンブリ言語がCPUが理解する数値コードとどのように異なるかについてよく考えています。
これは(本当ではあるが)完全にポイントを見逃している。
翻訳に関しては、アセンブリ言語と数値(2進数、16進数)はまったく同じものです。

それをグロックまたはドロップする
アセンブリをグロックすると、実際のコンピューターの動作がわかります。
grokkingアセンブリには以下が含まれます。

アセンブリを調べると、キーボードに接続されたCPUがどのように機能するかをほぼ完全に把握できます。
脳外科医がメスを使用するように、この知識を使用する必要があります。

悪臭を放つ抽象化を必要としない
アセンブリ(したがって手術台のCPU)を理解しない限り、RAMマシンの抽象化(または神がチューリングマシンに恐怖を禁じる神)から解放されることはありません。

L33t Hax0r 5k1llz
アセンブリは、133thax0rが保護スキームを無効にする方法を理解するのにも役立ちます。(Q:なぜASLRない仕事ないのでmov rax,fs:[28h]休憩それを)。

0.1%
重要なのはアセンブリの知識ではなく、作業中のマシンの知識です。
マシンを知りたい場合は、それを理解する必要があります。つまり、マシンの言語を話す必要があります。

そうしないと、抽象化に悩まされます。
それは科学であり、それは良いことですが、それは決して完全な状況ではありません。

それは話すことを学ぶようなものだコーサを
あなたは教祖のレベルを目指していない限り、あなたが知っているとの最高のスティック、これらのクリックは、あなたの人生を複雑にします

楽しいからです。


1
私が今まで出会ったことの記事でワードGROKの最も頻繁に使用
rekciltnuc

-1

私自身は、IBM System 32を使用して最初にRPG IIを学び、その後370でAPLを学びました。サイズと速度がすべてでした。私のマントラは小さくて速くなりました。アセンブリは、最もコンパクトで最速の言語です。Cとアセンブリの両方でテストプログラムを作成します。Cプログラムが数百Kbを必要とする場合、同等のアセンブリプログラムは多くの場合5 Kb未満です。Cコンパイラの出力を調べると、パラメータをチェックして再チェックするコードがあり、非常にまれでエキゾチックで非常に不要な可能性のあるエラーの条件付きチェックを行います。スタックとの間。

今日のプログラミング環境では、コードを記述すると、セキュリティと保護のレベルがさらに向上します。高レベル言語にアクセスできないハードウェアから情報を直接読み取ることができるため、プログラムをその特定のマシンでのみ使用できるようにアセンブリで暗号化できます。たとえば、ネットワークインターフェイスのMACアドレスを使用してユーザーキーを暗号化し、そのキーをハードドライブの特定の未登録セクターに駐車してから、セクターを不良としてマークし、他のファイルが上書きできないようにします。もちろんセクターを失いますが、それは何ですか?数十億兆から2048バイトまたは4096バイト?


1
「高レベル言語にアクセスできない」とはどういう意味ですか?
デビッドリチャービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.