2011-08-06 4 views
3

私は命令と対応するオペコードを調べていました。オペコードが同じで動作する命令が複数あるのはなぜですか?

je,jz - 0x74 (8 bit) 
je,jz - 0x0f84 (16/32 bit). 

なぜ私たちは、このような冗長な指示を持っています。例えば、「JE」と「JZ」などの命令は、同じオペコードを持っていますか?

アセンブリのコーディングが容易になるからですか?つまり、が「ジャンプする」場合はがゼロにジャンプする場合はと理解しやすい場合があります。しかし、私たちは最近、組み立ての際には、実際にはコードを書く必要はありません。

答えて

1

今日最も広く使用されているプログラミング言語ではありませんが、まだ使用されています。 g ++はアセンブリコードをコンパイルできます。あなたが何をしているのか分かっているなら、それはあなたに明確なスピードの利点を与えます。

ご質問に関しては、はい、あなたの権利があります。状況に応じて、同じオペコードを持つ異なる命令につながる、ある方法または別の方法を考えるのに役立ちます。

+0

なぜdownvoteですか?私に正当な答えのように見えます。 –

+0

ありがとうRudy。私はどちらかの面を見ることができた。 –

+1

私はダウン投票者ではありませんが、私の推測では、答えが実際の質問に本当に対処していないためです。OPのどこに誰が示唆していないのかについての質問の最後のコメントですasmはこれ以上書き込みませんか?いずれにしても、理由を言わずに投票を下すのは悪い形ですが、あまりにも一般的です。 –

5

これらは、同じ命令の異なる同義語です。命令はZフラグに基づいて分岐するだけです。 compare equal命令の結果が真の場合、Zフラグがセットされます。また、ゼロになる値をテストするように設定します。

7

私たち全員が学校で持っていたコンピュータアーキテクチャの本の古い引用は何ですか? 「x86には何も問題はありません。多くのことが意味をなさない」

あなたの質問に答えてください: "ジャンプゼロ"と "等しい場合はジャンプ"は、両方とも前の命令の結果に基づいて宛先アドレスにジャンプするためです。つまり、前の命令の結果は、ゼロフラグ(ZF)を1に設定します。JZは「数学」用であり、JEは「比較」用である可能性があります。だから、プログラマーの観点からは、2つのニーモニックが必要です。おそらく、初期のアセンブラーの作家は、もう1つの一般的なアセンブリ言語を模倣しようとしていたのかもしれません。

Looking at the Intel x86 manual for Jcc(条件付きジャンプ命令のセット)、JZとJEの両方が本質的に「等価(ZF = 1)の場合にジャンプ」を意味することがわかります。そして、実際には、これは特定のジャンプ命令セットに共通することに言及しています。

ステータスフラグの特定の状態は、ときどき が2通りの方法で解釈されるため、いくつかのオペコードに対して2つのニーモニックが定義されていることがあります。 たとえば、JA(上の場合はジャンプ)命令とJNBE(下の命令が でない場合)命令は、オペコード 77Hの代替ニーモニックです。

+0

本質的に、それはプログラマーの観点からのみ役立ちます。そうでない場合は、まったく同じです。 –

2

最近使用されていなくても、インテルのアセンブリ言語は古いです。元の8086と8088プロセッサーは1970年代のものであることを覚えておいてください。

のようないくつかの指示があることは、IBM PC/XTのようなものでアセンブリで書きました。
CMP AX, BX 
JE Somewhere 

または

AND AX, BX 
JZ somewhere_else 

彼らは、同じハードウェア命令にマップするために起こったことは重要ではありません。

2

なぜ英語を話すスピーカーは、トラックや他の人がトラックと言うのですか?誰にでも1つの規格に適合させる必要がありますか?すべてのハンバーガーはビッグマックでなければなりません。

最初はまだ組み立て中のプログラムです。十分な人は他の人がそうしないようにする。あなたのコンパイラはそれに大きく依存しています。コンパイラとプロセッサを開発せずにデバッグすることは難しい。コンパイラやプロセッサがなければ、どうすればいいでしょうか?

アセンブラパーサがジャンプを受け入れることは、ゼロビットがセットされている場合にジャンプと等しいならジャンプすることは自明であり、それらは同じ関数、同じ命令です。フラグを理解して使用している人(zフラグが付与されていることは容易ですが、署名されていない桁上げはそうではありません)は、桁上げ、ゼロのジャンプなどのフラグジャンプを使用するようなものです。その特定の操作のためにジャンプを参照したい場合は、等しくジャンプする場合はジャンプするよりも小さい場合はジャンプします。私は等しくなったらジャンプを取り除き、それ以下であればジャンプし、そしてただフラグを持っていることを好むだろう。もしcならばジャンプする、もしnならばジャンプする、nならばジャンプする、vならばジャンプする、など!

インテルはこれを見る最初のアーキテクチャでも最後のアーキテクチャでもありません。同じ理由から、ステータスレジスタのビットがオンまたはオフであると考えている人もいれば、これよりも大きいと思う人もいます。プロセッサがzフラグを持っている限り、zフラグが等しいことを意味することは周囲にありましたが、x86ファミリの年齢やgoofy命令セットとは関係がありません。このように開発者にとって親しみやすいことは、開発者をあなたのプロセッサに引き付けることです。ツールに実装するのは簡単です。

本当にこのことを知りたいのであれば、同じ命令セットに対してint構文とAT & T構文があるのはなぜですか?その狂気は、0ビットがセットされた命令であれば、ゼロビットがジャンプとエンコードの両方に設定されている場合に、等しい(ゼロビットセット)とジャンプするとジャンプを越えて行きます。

関連する問題