これら2つが本質的に同じであると仮定します。
push 1
と
0x1231
つまり、各アセンブリ命令はマシンコードにマップされます。
しかし、各マシンコードが1つのアセンブリコードにのみマップできる必要がありますか?
これら2つが本質的に同じであると仮定します。
push 1
と
0x1231
つまり、各アセンブリ命令はマシンコードにマップされます。
しかし、各マシンコードが1つのアセンブリコードにのみマップできる必要がありますか?
MIPS アセンブリ言語には、いくつかの「疑似命令」があります。たとえば、"move" は、内部的には暗黙の $0 オペランドを持つ "add" にすぎません。
命令の「同義語」をサポートするアセンブラー プログラムを完全に定義できます。ユーザー コードFOO
の意味をBAR
. 私はそれを行うアセンブラをすぐには知りませんが、どのマクロアセンブラでも自明な単純なマクロで同じ効果を確実に達成できます;-)。
シノニムがなくても、アセンブリ命令は複数のマシン コードにマップできます。
たとえば、 または のいずれかadd eax, ebx
として表すことができます。
実際、これは、特定のコンパイラを識別する場合などに役立ちます。この記事
では、さらに多くの例を見つけることができます。03 C3
01 D8
ある意味では、逆もまた真である可能性があります。
この例は少し大げさですが、同じマシン コード ( )が x86または のいずれかにF3 90
マップされます。
どちらが実行されるかは、コードが実行される CPU によって異なります。
同じオペコードが意図的に選択されましたが、プロセッサの状態に関する限り、違いはありません。実行時間 と正確な内部実装は、HT (PAUSE) CPU と非 HT (NOP) CPU で異なる場合があります。REP NOP
PAUSE
PAUSE
ほとんど違いがないvsは別REP NOP
として、静的に逆アセンブルしにくいマシン コードを記述できます。
たとえば、逆アセンブリがオフセット 0 とオフセット 1 で始まる場合、完全に異なるアセンブリ命令になるマシン コード シーケンスを慎重に構築することが
できます。自己修正アセンブリ コードを記述して、静的解析を難しくすることもできます。
はい。これの実際の例は68k アセンブラーです。
公式ニーモニックの BCC (branch on Carry clear) および BCS (branch on Carry set) は、それぞれ BHS (branch on higher than or same) および BLO (branch on less than) に名前を変更できます。多くの 68000 アセンブラは、これらの代替ニーモニックをサポートしています。
特定のマシンコード命令が何をするかは、それが対象とするプロセッサ(またはプロセッサファミリ)によって決まります。そして、同じマシンコード命令は常に基本的に同じことをします。
通常、特定のマシンコード命令は1つのステートメントにのみ分解されます。いくつかのより複雑な命令セットでは、アセンブラで同じ式を記述するいくつかの方法があります。良い例は、インデックス付きルックアップです。一部のステートメントには同義語を含めることもできますが、これもプロセッサにとって同じことを意味します。
ただし、アーキテクチャに対して複数のアセンブリセット全体が存在する可能性があります。これは、Intelによって定義された標準セットがあるx86アーキテクチャで発生し、次にAT&Tによって作成されたものに基づく別のアーキテクチャがあります。これはGCCによって使用されるものです。
複数のアセンブリステートメントが基になるプロセッサの同じオペコードにマップされるアセンブリ言語を設計できなかったという概念的な理由はわかりません。
また、それを行う特に正当な理由はすぐにはわかりませんが、遅れており、何かが欠けている可能性があります。
一般に、アセンブリのポイントは、何が実行されるかについて曖昧にすることなく、マシンを直接プログラムできるようにすることです。ほとんどの場合、1:1 のマッピングが必要です。
一部のアセンブラーのどこかに、おそらくプロセッサの一部のラインでのオペコードの変更に対処するための間接マッピングがいくつかあるとしても、私は驚かないでしょう。私は何も知りません。