学校では、しばらくの間MIPSアセンブリ言語でプログラミングを行ってきました。私はx86アセンブリを掘り下げることに興味があり、それはやや難しいと聞きました(私のMIPS教科書でさえこれを述べています)。
x86の世界に飛び込む前に、MIPSプログラマーとして知っておくべきコア情報は何ですか?
心に留めておくべき最大のことは次のとおりです。
それ以外は、x86は非常に単純です。'lea'や'test'のような指示を乱用することを学ぶとき、あなたはそれを愛することを学びます。また、ヒント:インテルは、取扱説明書のコピーを無料でお送りします。送料を支払う必要はありません。彼らのサイトでフルフィルメントメールを探し、SKUで本をリクエストします。
x86には、他のほとんどのアーキテクチャと比較して、使用可能なレジスタのセットが非常に限られています。これにより、アセンブリ言語の習得が実際に難しくなることはありませんが、実際にコードを実装するのが難しくなる場合があります。
また、強力な下位互換性のx86の歴史のために、命令セットはひどく対称的ではなく(間違いなくRISC以前)、注意すべきルールとコーナーケースには多くの例外があります。
アセンブラを自分で書くために 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。また、レジスタ間接条件付きジャンプがないことに気付くのも良いことです。それは私も気になりました。
知っておくべきすべての可能性があるわけではありませんが、あなたの質問から最初に頭に浮かんだことを以下に示します。しかし、おそらくあなたは今のところこれらとうまくやっていくことができます.
x86には、MIPSよりも複雑な命令があります。したがって、MIPSの一般的なシーケンス(特にメモリアドレス指定)にはおそらく単一の命令があります。多数のレジスタがないことは確かに不利ですが、どちらのアーキテクチャにも、自由に使用できるものの数を4〜5に制限する規則があります。x86でさらに顕著になります。x86には、MIPSよりもレジスターの使用に関する例外が多く、注意する必要がありますが、絶えず泣き言を言う価値はありません。
経験から言えば、どちらの言語もほぼ同じように学ぶのが難しく、慣習も含まれています。豊富なオンラインリソースとその人気を考えると、x86の方が少し簡単かもしれません。
x86の難しい部分は、可変長命令といくつかのアドレッシングモードのために、バイナリを生成することです。ほとんどの場合、とにかくそれを行う必要はありません。
確かに、MIPSよりも複雑な命令アーキテクチャを学ぶことをお勧めします。
そして、これは重要です。RISCとCISCの間の宗教戦争に参加しないでください...