6

これは、カーネルコードの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

誰かがこの指示を理解するのを手伝ってくれますか?

4

1 に答える 1

6

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

lプレフィックスは、プロシージャから遠く離れていることを示すためにここにありますこの場合、命令は最初にスタックからEIPレジスタに値をポップし、次に2番目の値をCSレジスタにポップします。

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をダウンロードする必要があります。これには、各命令の実行内容を詳細に示す擬似コードを含む、すべての命令の正確な詳細が記載されています。

于 2011-09-08T07:43:11.777 に答える