2012-03-20 11 views
4

特定のバイナリファイル(Linux elf)を逆アセンブルしました。 そして、私はこのコードを見つけました:ds、es登録

movsl %ds:(%esi),%es:(%edi) 

2つのレジスタ 'DS' と 'ES' はあります。 これらは「セグメント・レジスタ」と呼ばれています。 しかし、 'mov addr、%es(または%ds)'のような行はありません。 これらのレジスタはどこにポイントしていますか?

答えて

1

セグメントレジスタは、OSによって初期化されます。ほとんどのOSはフラット・メモリ・モデル(セグメンテーションなし)を使用しているため、ほとんどの最新のOSでは、すべてのアドレス空間を参照している同じセグメントを指しています。

ds(ほぼすべてのメモリアクセスのデフォルト)を使用しない理由は、movsのオペランドが暗黙的であり、DOS時に意味があるからです。

DOS(リアルモード)では、レジスタが16Bitに制限され、64Kのアドレス空間に制限されているため、実際の使用がありました。アドレス空間(1M)は、重複する64Kセグメントに分割されました。