3

Assembly では、メモリ、コード、データ、セグメントなどに関する大きな理論的議論があります。

率直に言ってもまったく意味がありません。

コード、テキスト、データなどとは?

私はチュートリアルを読みましたが、それらはアプリケーションのみに焦点を当てており、書かれた言葉の下でコードが100%何をしているかではありません。

これが不明確な場合、私はアセンブリプログラマーになることはできません。これをより明確にするチュートリアルはありますか?

4

4 に答える 4

8

OK、システムごと、ツールチェーンごとに異なる可能性があるという点で、この内容の一部は少し主観的ですが、次のとおりです。

  • コードとテキストは通常​​、「このセクション/セグメントに実行可能なコードが含まれている」ことを意味する同義語です。

  • データは通常、「このセクション/セグメントには実行不可能なデータが含まれています」という意味です

ハードウェアがサポートしている場合、データ セクションがロードされるメモリ ページは「実行不可」とマークされている可能性があるため、プログラムがその領域にジャンプしようとすると、おかしなことをするのではなく、すぐにクラッシュします。

同様に、プログラムによって誤って変更されないように、コード/テキスト セクションのページが「読み取り専用」とマークされている場合があります。一部のシステムには、文字列リテラルや定数変数などを配置する「読み取り専用データ」セクションもあります。

最も極端な例は、コード メモリとデータ メモリが同じ物理デバイスではないハーバード アーキテクチャです。

于 2013-01-07T22:47:19.167 に答える
4

最下位レベルでは、コードとデータの間に実際の区別はありません。結局のところ、すべてのコードはデータです。コンパイラに問い合わせるだけで、どんなデータでも実行できます。オペレーティング システムは、さまざまなメモリ ブロックへのアクセス方法に規則を適用します。そこから差別化が始まります。言語レベルとシステム レベルが高くなるほど、区別はより複雑になり、ヒープとスタック、ページ メモリ、仮想メモリ、仮想マシンが得られます。すべてが非常に複雑になりますが、Apple のクールなガジェットのように見えても、根底にあるのはフォン ノイマン マシンです。

はい、私は以前アセンブラー プログラマーでした。

于 2013-01-07T22:52:07.963 に答える
0

たぶん、いくつかの歴史的背景がここに整然としています。現在人気のあるアーキテクチャは、 コードとデータが同じメモリで共有されるVonNuemannタイプです。すべてのアーキテクチャがこのようになっているわけではありません。コードとデータを分離しているものもあります。

于 2013-01-07T22:49:29.680 に答える
0

私は、理解せず推測している人々の間でない限り、これらの用語に関する「偉大な理論的議論」を聞いたり見たりしたことがありません.

ビットは単なるビットであり、レベルが低くなるにつれて、長期的な意味が少なくなります。高水準言語では、変数は何らかの「型」として非常に明確に定義されている場合があり、その変数は、そのプログラムまたはスコープでのその変数の存続期間中、常にその型です。しかし、ロジックに近づくにつれて、ビットは単にビットまたは信号になり、型が失われます。型は意味をなさず、重要ではありません。データビットでそれを行っている何かの「アドレスを計算」している場合、それらはアドレスバスに着陸する瞬間までアドレスになりません。それらはアドレスであり、残りの時間は単にビットが横たわっています。

プロセッサがどこかから「命令」を「フェッチ」すると、最終的にそれを実行する目的で命令をフェッチする行為は、それらのビットをコードにします。しかし、命令を構成するすべてのビットを取り、その命令をより小さな部分に分割すると、それらのビットの一部は、レジスタまたはアドレスにロードされているデータまたは使用されているアドレスの一部である可能性がある即値である可能性があります一部のデータにアクセスします。したがって、その「コード」の一部は、コードに密接にバンドルされた単純なデータです。したがって、ある観点から見ると、ビットは、フェッチされて命令として実行される運命にある短い瞬間にのみコードと呼ばれる可能性があります。RAM、キャッシュ、またはディスク上に配置されている間、それらはほとんどの場合単なるデータです。

そのコードがハードディスクから読み取られ、メモリに書き込まれ、オペレーティングシステムがそのコードを実行しようとするずっと前に、それは単なるデータビットであり、下位レベルでは jpeg 画像または mpeg ビデオと区別できません。または、ハードディスクから読み取られてメモリに移動されるビット。

命令が実行される命令としてではなくメモリを読み書きしている場合(その時点での操作に関する限り)、それは単なるデータであり、それらのビットの一般的な用語のビットです。それらは常にデータであり、命令として直接的または間接的に実行されることが実際にまたはおそらく予定されている場合、コードの二重定義を持ちます。

なんらかの理由でテキスト対データテキストに関する限り(スタックオーバーフローの他の場所で詳細に説明されています)、テキストは基本的にプログラムのコード部分であり、コードの別の言葉であり、命令部分です。データは単なるデータであり、命令ではない部分は命令にはなりません。少なくともその文脈では。

重要ではない歴史的または実際的な理由により、プログラムは多くの場合、命令であるビットの一部で構成され、一部はデータ、たとえば変数を保持するメモリ、またはコードに埋め込まれた画像があると見なされる場合があります。 、またはプログラムの実行時に、プログラムが動作するどこかからのデータが読み込まれる、初期化されていないメモリの配列。コンパイラの専門用語は、コード部分にテキストという用語を使用し、他の部分がある場合はデータを使用する傾向があります。

多くの場合、目的や宛先に関係なく、すべてのビットを「データ」と呼ぶことは間違いではありません。

メモリとは、ビットを格納するものです。その上には多くの接線がありますが、基本的には、短期または長期、またはその両方のビットを保存します。

セグメントとは、セグメントに分割されたものを意味する言葉です。多くの人は最初、x86 とその歴史はセグメント化されたアーキテクチャであると考えていますが、これは複雑すぎることがよくありますが、そのアーキテクチャに関する限り、複数のレジスタまたはエンティティを使用してアドレスが計算されることを意味します。多くの場合、いわゆるフラットメモリアーキテクチャが常にセグメント化を使用していることに気づいていません。多くの場合、ビデオ メモリは一度に 1 つのセグメントにしかアクセスできません。多くの場合、ハード ディスクは一度に 1 つのセグメントにしかアクセスできません。小さな開口部があり、そこから覗いてアドレス指定できます。残りのアドレスは別の場所で管理されます。2 つのアドレスは、プログラムの外のある時点で一緒になってアクセスします。アクセスしたいもの。セグメントにアクセスするための境界と規則は、ハードウェアと場合によってはソフトウェアによって異なります。

あなたの質問は非常に漠然としています。何をしたいのか、何に夢中になっているか、自分で質問に答えるためにどのようなリソースを使用しましたか。アセンブリ言語を学ぼうとしていて、一冊の本しか見ていない場合、その本とその言語、またはその両方がつまらない可能性があり、時間を無駄にしている場合は、別の本または別のアセンブリ言語を見つけてください。特定のプログラミング言語を教えるさまざまな本が山ほどあります。たとえば、C を例にとると、それらの本のすべてが本当に優れていて、すべての人に役立つというわけではありません。具体的にあなたの質問を呼び出してください、私はこの「何とか」の本で「何とか」を読みましたが、この言葉が何を意味するのかわかりません。どのように適用されますか。

于 2013-01-08T03:24:01.077 に答える