2

これら2つが本質的に同じであると仮定します。

push 1

0x1231

つまり、各アセンブリ命令はマシンコードにマップされます。

しかし、各マシンコードが1つのアセンブリコードにのみマップできる必要がありますか?

4

7 に答える 7

4

MIPS アセンブリ言語には、いくつかの「疑似命令」があります。たとえば、"move" は、内部的には暗黙の $0 オペランドを持つ "add" にすぎません。

于 2010-04-07T13:24:46.700 に答える
3

命令の「同義語」をサポートするアセンブラー プログラムを完全に定義できます。ユーザー コードFOOの意味をBAR. 私はそれを行うアセンブラをすぐには知りませんが、どのマクロアセンブラでも自明な単純なマクロで同じ効果を確実に達成できます;-)。

于 2010-04-07T01:28:55.140 に答える
2

シノニムがなくても、アセンブリ命令は複数のマシン コードにマップできます。
たとえば、 または のいずれかadd eax, ebxとして表すことができます。 実際、これは、特定のコンパイラを識別する場合などに役立ちます。この記事 では、さらに多くの例を見つけることができます。03 C301 D8

ある意味では、逆もまた真である可能性があります。
この例は少し大げさですが、同じマシン コード ( )が x86または のいずれかにF3 90マップされます。 どちらが実行されるかは、コードが実行される CPU によって異なります。 同じオペコードが意図的に選択されましたが、プロセッサの状態に関する限り、違いはありません実行時間正確な内部実装は、HT (PAUSE) CPU と非 HT (NOP) CPU で異なる場合があります。REP NOPPAUSE

PAUSEほとんど違いがないvsは別REP NOPとして、静的に逆アセンブルしにくいマシン コードを記述できます。
たとえば、逆アセンブリがオフセット 0 とオフセット 1 で始まる場合、完全に異なるアセンブリ命令になるマシン コード シーケンスを慎重に構築することが
できます。自己修正アセンブリ コードを記述して、静的解析を難しくすることもできます。

于 2010-04-07T01:31:08.643 に答える
2

はい。これの実際の例は68k アセンブラーです。

公式ニーモニックの BCC (branch on Carry clear) および BCS (branch on Carry set) は、それぞれ BHS (branch on higher than or same) および BLO (branch on less than) に名前を変更できます。多くの 68000 アセンブラは、これらの代替ニーモニックをサポートしています。

于 2010-04-07T01:50:07.787 に答える
0

特定のマシンコード命令が何をするかは、それが対象とするプロセッサ(またはプロセッサフ​​ァミリ)によって決まります。そして、同じマシンコード命令は常に基本的に同じことをします。

通常、特定のマシンコード命令は1つのステートメントにのみ分解されます。いくつかのより複雑な命令セットでは、アセンブラで同じ式を記述するいくつかの方法があります。良い例は、インデックス付きルックアップです。一部のステートメントには同義語を含めることもできますが、これもプロセッサにとって同じことを意味します。

ただし、アーキテクチャに対して複数のアセンブリセット全体が存在する可能性があります。これは、Intelによって定義された標準セットがあるx86アーキテクチャで発生し、次にAT&Tによって作成されたものに基づく別のアーキテクチャがあります。これはGCCによって使用されるものです。

于 2010-04-07T01:33:56.483 に答える
0

複数のアセンブリステートメントが基になるプロセッサの同じオペコードにマップされるアセンブリ言語を設計できなかったという概念的な理由はわかりません。

また、それを行う特に正当な理由はすぐにはわかりませんが、遅れており、何かが欠けている可能性があります。

于 2010-04-07T01:29:06.900 に答える
-2

一般に、アセンブリのポイントは、何が実行されるかについて曖昧にすることなく、マシンを直接プログラムできるようにすることです。ほとんどの場合、1:1 のマッピングが必要です。

一部のアセンブラーのどこかに、おそらくプロセッサの一部のラインでのオペコードの変更に対処するための間接マッピングがいくつかあるとしても、私は驚かないでしょう。私は何も知りません。

于 2010-04-07T01:32:43.833 に答える