2017-01-25 6 views
0

スタックポインタを2バイトの境界に揃える必要があることが分かりました。つまり、SPを0xF(またはその他の奇数)で終わる値に設定すべきではありません。x86リアルモード(アライメント)でスタックポインタアドレスを選択

SPとして0xFFFFを使用するとどうなりますか? 64kBはすべて使用可能か、それとも1バイト少ないですか?

スタックサイズを1024バイトにしたい場合は、SPを0x3FFまたは0x400に設定する必要がありますか?例えばSS(スタックセグメント)が使用されることを指しているバイトですか?

hereには、0xEで終わるSPアドレスも使用しないでください。「0x..Eおよび0x..F」のバイトを無駄にする必要があります。どうして?

答えて

1

x86スタックは、完全降順です。
完全は、スタックポインタが最後にプッシュされた項目を指すことを意味します。これは、の空の降順/昇順のスタックと対照的です。ここでは、スタックポインタが次の空いている場所を指しています。プッシュあなたが故に、Xは、Xは、最後の項目の場所と考えられているアドレスにスタックポインタspを設定すると

基本的に、これはpush axの意味が

sub sp, 02h 
mov WORD [sp], ax 

であることに帰着しますそれは使用されません。
spを0xeに設定すると、プッシュはspを0xe-2 = 0xcに移動し、そこでオペランドを書き込みます。 0xe以上のメモリには触れません。

spに奇数アドレスを使用すると、アライメントされていないメモリアクセスのレイテンシがアライメントされたアクセスのレイテンシの2倍になる可能性があるため、パフォーマンスに悪影響を及ぼします。
DRAMバス幅(書き込み時は8バイト)よりも少ない量の場合、このペナルティは多少減少します。
スタックの使用頻度を考慮すると、スタックを整列させたままにする価値があります。スタックポインタはプッシュが、0xFFFFにspを設定します。1. に達したが、上位バイトがss範囲外であるため、その単語を書くことが#SSがトリガーする際にトラブルにつながるspための奇数アドレスを皮切り


混乱したスタックで例外を発生させると、CPUが#DFとしてディスパッチする別の#SSが生成されます。
しかし、スタックはまだまだ混乱しているので、三つ目の例外が生成され、トリプルフォルトが発生し、CPUはリセットされます。
スタックポインタが揃っていないとメリットはありません。あなたのサイズSの積み重ねが必要な場合

あなたが設定sp S modの2から2 < = そのS < =の64KiB付与されました。
S(例:4)という小さな値の例を書き留めることで、これが正しいかどうかを確認できます。
spを0に設定すると、リアルモードで自然に使用できる最大サイズの64KiBスタックが得られることも確認できます。

+0

#GPはリアルモードで表示されますか?例外がスローされたときに何が起こるはずですか?私は私のブートローダでそれを引き起こすように見えることはできません、1つのオーバー/アンダーフローバイトはちょうど失われるようです。 – user2725580

+0

@ user2725580 AFAIR(そしてIntelのマニュアルによれば)それは上げられるべきです。 #GPはintです13.トリガーされますか?私はこれを後でテストし、最終的に答えを更新します。あなたに洞察があれば教えてください。 –

+0

@ user2725580 SSの例外です!私は一瞬で答えを更新します –

関連する問題