2

orを追加せずに AT&T アセンブリ構文を使用してSS:orを先頭に追加するにはどうすればよいですか?ES:.byte 0x36.byte 0x26

すなわち。mov dword ptr ss:[esp+0x10], offset foo以下を使用せずに Intel 構文から AT&Tに変換するにはどうすればよいでしょうか。

.byte   0x36
movl    $foo, 0x10(%esp)

警告なしでアセンブルしようとmovl $foo, %ss:0x10(%esp)しましたが、バイナリを調べてもまだ追加されませんSS:

4

1 に答える 1

5

およびレジスタで使用するSS:場合、接頭辞は必要ありません。これらのレジスターはベースとして、すでにデフォルトのセグメントになっています。ESPEBPss

これが、スペースを節約するためにアセンブラが単純にそれを省略する理由かもしれません。

マシンコードに実際の SS プレフィックスを必要としないか、必要としません (配置/パディングの理由で命令を長くしたい場合を除きます)。Intel 構文逆アセンブリのSS:は、アドレッシング モードによって暗示されるデフォルト セグメントを思い出させるためのものです。

なんらかの奇妙な理由でマシンコードに冗長な SS プレフィックスが必要な場合は、ディレクティブを使用して手動でプレフィックスSS:発行できます。.byte 0x36アセンブラは raw バイトを変更しません。


主流の 32 ビット OS は、すべてのセグメント ベースが 0 であるフラット メモリ モデルを使用するため、とにかく問題になりません。そのため、ESP を EAX などの別のレジスタにコピーして、スタック var のアドレスを取得し、(%eax)akaで逆参照して、%ds:(%eax)同じスタック メモリをアドレス指定することができます。そのため、コンパイラはポインターがどこから来たのかを知る必要がなく、 を使用する必要もありません%ss:(%eax)

非フラット メモリ モードで独自の OS を作成していない場合、通常のコードでは FS または GS セグメント オーバーライド (スレッド ローカル ストレージ用) のみが役立ちます。

于 2010-08-08T10:19:23.980 に答える