19

学校では、しばらくの間MIPSアセンブリ言語でプログラミングを行ってきました。私はx86アセンブリを掘り下げることに興味があり、それはやや難しいと聞きました(私のMIPS教科書でさえこれを述べています)。

x86の世界に飛び込む前に、MIPSプログラマーとして知っておくべきコア情報は何ですか?

4

4 に答える 4

20

心に留めておくべき最大のことは次のとおりです。

  • 汎用レジスタはほとんどなく、持っているものは純粋なGPではありません。多くの命令では、特定の目的のために特定のレジスタを使用する必要があります。
  • x86命令は、特定の操作をより複雑にする可能性がある3オペコードではなく2オペコード形式です。つまり、r0、r1、r2(r0 = r1 + r2)を追加する代わりに、eax、ebx(eax + = ebx)を追加します。
  • プロテクトモードのセグメント(事実上、DOS以外のすべての32ビットコード)は、メモリアドレス指定スキームを非常に非自明にします。これにより、開始時にお尻に噛み付く可能性があります。
  • あなたはいつも指示によって設定/クリアされたフラグを調べるつもりです。インテルのマニュアルを愛することを学びましょう。
  • 編集、私が忘れていた1つのこと:サブレジスタの使用(たとえば、eaxレジスタの下位16ビットの上位8ビットにアクセスするため)は、レジスタへの追跡操作を非常に困難にする可能性があります。注意して、物事が落ち着くまで自由にコメントしてください。

それ以外は、x86は非常に単純です。'lea'や'test'のような指示を乱用することを学ぶとき、あなたはそれを愛することを学びます。また、ヒント:インテルは、取扱説明書のコピーを無料でお送りします。送料を支払う必要はありません。彼らのサイトでフルフィルメントメールを探し、SKUで本をリクエストします。

于 2009-01-17T21:46:56.243 に答える
6

x86には、他のほとんどのアーキテクチャと比較して、使用可能なレジスタのセットが非常に限られています。これにより、アセンブリ言語の習得が実際に難しくなることはありませんが、実際にコードを実装するのが難しくなる場合があります。

また、強力な下位互換性のx86の歴史のために、命令セットはひどく対称的ではなく(間違いなくRISC以前)、注意すべきルールとコーナーケースには多くの例外があります。

于 2009-01-17T21:22:32.610 に答える
2

アセンブラを自分で書くために x86 と x86_64 を学んでいます。自分でアセンブラを書くつもりがないなら、私が言うことのいくつかはほとんど役に立たない. 私はMIPSについては知りません。

x86 の間接アドレス指定は複雑です。1 つの命令で、次のことができます。

mov reg, [reg+offset]
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8.

このため、命令のエンコードは複雑ですが、この方法でエンコードするすべての命令で一貫しています。sandpile.orgからこれを読みたいと思うかもしれません。エンコーディングについてもっと知りたい場合は、いつでも私に質問できます。もう 1 つの命令エンコーディング関連の煩わしい詳細は、プレフィックスです。それらは指示の意味を大きく変えます。たとえば、0x66 (私の記憶が正しければ) が先頭にあり、一部の命令は 32 ビットではなく 16 ビット GPR 用になります。

32 ビット GPR (順番): eax、ecx、edx、ebx、esp、ebp、esi、edi

64 ビット GPR: rax、rcx、rdx、rbx、rsp、rbp、rsi、rdi、r8、r9、r10、r11、r12、r13、r14、r15

汎用レジスタが少ないことに注意してください。これにより、ほとんどのソフトウェアは多かれ少なかれスタックマシンの方法で使用する必要があります。痛ましいディテール。rsp はスタック (pop、push 命令) に使用され、rbp も予約される傾向があります。x86_64にはより多くのレジスタがありますが、すべての消費者がそれに対応したプロセッサを持っていたとしても、人々がそれを採用するまでには時間がかかります.

浮動小数点演算には 2 つの異なる命令セットがあります。XMMが新しいです。x86_64 では 16 個の 128 ビット レジスタが利用可能で、x86 では 8 個しかありません。古い命令セットはレジスタをスタックとして扱います。スワップ、ニップ、腐敗がないだけなので、それを扱うのは気が遠くなります。

使用中の x86 は、RISC マシンに縮小する傾向があります。これらの複雑な命令の一部は、新しいマシンでは効果がないか、さらに遅くなります。読んだり書いたりする内容に応じて、約 30 ~ 150 の指示を理解する必要があります。古い命令や AL/HL などを完全に無視することもできます。1978 年の背後にあるこのすべての乱雑な起源を覚えておいてください。それから 31 年、IA-32 の最初の導入から 24 年経っても、それほど悪くはありません。その間に多くのことが関連性を変えます。

直接のジャンプと呼び出しは、x86 では次の命令から相対的に行われるようです。したがって:

    jmp nowhere  # or call, jz, jg whatever...
nowhere:
    nop

「JMP imm:0, NOP」にエンコードされて終了します。絶対ジャンプを行うレジスタ間接 jmp。また、レジスタ間接条件付きジャンプがないことに気付くのも良いことです。それは私も気になりました。

知っておくべきすべての可能性があるわけではありませんが、あなたの質問から最初に頭に浮かんだことを以下に示します。しかし、おそらくあなたは今のところこれらとうまくやっていくことができます.

于 2009-01-17T22:25:30.860 に答える
1

x86には、MIPSよりも複雑な命令があります。したがって、MIPSの一般的なシーケンス(特にメモリアドレス指定)にはおそらく単一の命令があります。多数のレジスタがないことは確かに不利ですが、どちらのアーキテクチャにも、自由に使用できるものの数を4〜5に制限する規則があります。x86でさらに顕著になります。x86には、MIPSよりもレジスターの使用に関する例外が多く、注意する必要がありますが、絶えず泣き言を言う価値はありません。

経験から言えば、どちらの言語もほぼ同じように学ぶのが難しく、慣習も含まれています。豊富なオンラインリソースとその人気を考えると、x86の方が少し簡単かもしれません。

x86の難しい部分は、可変長命令といくつかのアドレッシングモードのために、バイナリを生成することです。ほとんどの場合、とにかくそれを行う必要はありません。

確かに、MIPSよりも複雑な命令アーキテクチャを学ぶことをお勧めします。

そして、これは重要です。RISCとCISCの間の宗教戦争に参加しないでください...

于 2009-01-17T21:51:25.330 に答える