2011-09-08 9 views
5

これは、header.Sファイルのコードスニッファーで、カーネルコードです。私はlretw命令が何をするのか理解できませんでした。私は命令のために非常に多くのオンラインソースをチェックアウトしました。このコードスニペットの理解に役立つ

# We will have entered with %cs = %ds+0x20, normalize %cs so 
# it is on par with the other segments. 
     pushw %ds 
     pushw $6f 
     lretw 

この指示を理解するのに役立つ人はいますか?

+0

http://disi.unitn.it/~abeni/SO2/LinuxKernel/boot.html? – istepura

答えて

5

retは、プロシージャから戻るための指示です。したがって、基本的にスタックからの戻りアドレスをEIPレジスタにポップします。

l接頭辞は、遠方復帰から返されます。この場合、命令は最初にスタックからEIPレジスタに値をポップし、次にCSレジスタに第2の値をポップします。

w接尾辞がここにあるのは、この段階ではリアルモードで実行され、オペランドは16ビット幅であるためです。

正確なコードは次のとおりです。

pushw %ds 
    pushw $6f 
    lretw 
6: 

6:はここに非常に重要です。つまり、dsの値をスタックにプッシュし、6ラベルのアドレスをスタックにプッシュしてから、このlretw命令をトリガーします。基本的には、ラベル6のアドレスを命令ポインタレジスタにロードし、csレジスタにdsレジスタの値をロードします。これは、ラベル6で実行を続行し、csレジスタ値を変更するという単なるトリックです。

http://www.intel.com/design/intarch/manuals/243191.htmをダウンロードして、各命令の詳細を示す擬似コードを含め、すべての命令について正確な情報を提供する必要があります。

+0

私はこのマニュアルを見ましたが、特定の指示を見つけることができませんでした。私は非常に明確ではなかったかもしれません.. あなたは本当に素晴らしい説明のためにすごく感謝しています..私はそれを好きでした.. –

+0

ちょっとコメントは、%csを正常化すると言っている意味ですか...私を助けてくれてありがとう。 –

+0

なぜ6ドルですか? $ 6fの平均絶対値はありません。そして、接尾辞は何をしますか?申し訳ありません。 –

関連する問題