2016-06-23 8 views
0

gdbを使用して、使用中のシステムがリトルエンディアンのアプローチを採用している場合、メモリからレジスタにバイトがコピーされるときに、それらが逆になることがわかりました。操作とendianess

x86アセンブリー命令セットでは、両方のオペランドがメモリー内にある操作が許可されていないため、私は疑問に思っていました。まず、リトルエンディアンの値を直接逆順に実行する操作はありますか?

+0

メモリオペランドを2つ指定できますが、少なくとも1つは暗黙的に指定する必要があります。たとえば、 'push'、' pop'、 'movs'を参照してください。私はあなたの質問の残りの部分、または2つのメモリオペランドが必要な理由を理解していません。たとえば、 'add [foo]、eax'は合法であり、メモリ上で動作します。 – Jester

+0

私が意味していたのは、操作の追加-0x8(%ebp)、%eaxです。それはメモリから最初の値を取得し、それを逆にしてeaxの内容に追加することです。最後に結果はeaxに保存されます。私の質問です:(メモリを移動するためのもののほかに)メモリオペランドを逆転させない操作はありますか? – badnack

+1

それは "反転"されず、正しい順序でメモリに格納され、正しい順序でメモリから読み込まれます。lsバイトレーンが最初に、msバイトレーンが最後に、コントローラがビッグエンディアンの場合と同様にバイトを右バイトレーンに配置します。コントローラはバイトを右バイトレーンに配置します。 x86では、アライメントされていないので、レーンのいずれかにあるバイトを取って正しいレーンに移動する必要があります(バスに依存するか、プロセッサコアの内側にあるかはデザインによって異なります)。 –

答えて

2

この回答は、経験豊富な人には少し奇妙に見えるかもしれませんが、質問者が探しているのはMOVBEです。それは、(彼の議論に関連して)そのままのデータをレジスタにコピーします。すべてのアーキテクチャで利用できるわけではありませんが、この特定の問題に対する最良の解決策です。だから私は思っていた

への答えは:最初に逆転されることなく、リトルエンディアン値上で直接実行されるすべての操作はありますか?

はい:MOVBEは、必要な順序でバイトをコピーします。

+1

私は経験の人たちが、そういうことを言うとしようとしています。まあ、「movbe」はバイトを逆転させるものです。エンディアンはプロセッサの内部配線によるものですが、インテルは言葉を逆転させるためにトランジスタを無駄にしました。あなたはレジスタ値がそれを表示するために使用される数字であるという誤解を広めているようです。私たちはRAXのようなレジスタがどのようにロードされているのかわかりませんが、低いアドレスのバイトはAL(下位バイト)に入り、その逆もあります。 ALが実際にビット56-63またはビット0-7である場合、わかりません。 –

関連する問題