質問:
レジスタ操作によるAMD64コンパイラの最適化
Modoc
2013-03-21 06:44:32 UTC
view on stackexchange narkive permalink

AMD64(別名x86-64またはx64)レジスタは、一度に8、16、32、または64ビットでアクセスできます。分解リストを読むとき、どのレジスタ操作が簡単ではありませんか?

たとえば、命令がレジスタの一部にアクセスするとき、それは他の部分にどのように影響しますか?

どのような典型的な命令またはオプティマイザによって使用される一連の命令は、明白ではないものをエンコードする可能性があります(たとえば、レジ​​スタをそれ自体で排他的論理和してゼロに設定する)?

この質問は広すぎます。それは完全な答えではなく逸話のリストにつながります。少なくとも特定のトピックに、できれば特定のコンパイラまたはプラットフォーム(Visual C ++でのスタック操作など)に限定して、はるかに焦点を絞る必要があります。すでに[1つの回答](http://reverseengineering.stackexchange.com/a/111)が存在するため、その回答のトピックであるレジスタ操作に焦点を当てた編集を提案しました。
@Gillesを編集していただきありがとうございます。質問したところ、質問が広すぎることはわかっていましたが、それでも自分の欲しいものを伝える方法で言い換えることはできませんでした。
質問がまだあなたが興味を持っているものに近づいていることを願っています。 VC ++を使用したスタック操作について別の質問をすることをお勧めします。この質問を編集してそれに焦点を合わせましたが、既存の回答に対応する方が便利だと思いました。
1 回答:
Igor Skochinsky
2013-03-21 08:15:42 UTC
view on stackexchange narkive permalink

実際には最適化ではありませんが、x86から​​取得するときに注意する必要がある1つの落とし穴は次のとおりです。

32ビットレジスタでの操作は、64ビットレジスタの上半分をゼロにします。

たとえば、次のようになります。

  mov eax、3  

実際には次と同等です:

  mov rax、3  

これは、新しいレジスタ r8 - r15 にも適用されます。例:

  inc r8d  

も、 r8 の上半分をゼロにします。

ただし、レジスタの8ビット部分と16ビット部分はそのようには機能しません。つまり、それらに対する操作はレジスタのその部分のみを変更します。



このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...