2017-01-25 22 views
0

Я понял, что нужно выровнять указатель стека с 2-байтной границей. Другими словами, нельзя устанавливать значение SP, которое заканчивается на 0xF (или любой другой нечетный).Выберите адрес указателя стека в реальном режиме реального времени (выравнивание)

Что произойдет, если я использую 0xFFFF как SP? Все ли 64 КБ полезны, или один байт меньше?

Если я хочу размер стека 1024 байта, должен ли я установить SP на 0x3FF или 0x400? например это байт, в котором SS (сегмент стека) указывает на то, что он будет использоваться?

Они заявляют, что here следует также не использовать SP-адрес, заканчивающийся в 0xE «тратить байты на 0x..E и 0x..F». Как так?

ответ

1

Хлопок x86: полный по убыванию.
Полный означает, что указатель стека указывает на последний нажатый элемент. Это контрастирует с пустым нисходящим/восходящим стекем, где указатель стека указывает на следующее свободное место.

В основном, это сводится к семантике push ax быть

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

При установке указателя стека sp по адресу X, X считаются местонахождением последнего пункта толкал, следовательно, он не будет использоваться.
Если вы установили sp в 0xe, то нажатие переместит sp в 0xe - 2 = 0xc и запишет там его операнд. Память при 0xe и выше не затрагивается.

Использование нечетного адреса для sp отрицательно влияет на производительность, поскольку неправильный доступ к памяти может иметь задержку как двойную, как у выровненного доступа.
Для количеств меньших, чем ширина шины DRAM (на момент написания 8 байтов), это наказание несколько уменьшается.
Учитывая, как часто используется стек, стоит поддерживать его выравнивание.

Начиная с нечетным адресом для sp приведет к неприятностям, когда указатель стеки достигает 1. Толчок установит sp на 0xffff но писать слово будет вызывать #SS, потому что старший байт находится вне предела ss ,
Создание исключения из перепутанного стека, в свою очередь, приведет к еще одному #SS, который CPU отправит как #DF.
Но стек все еще испорчен, поэтому генерируется третье исключение, тройная ошибка, и CPU сбрасывается.
Таким образом, нет никакой пользы в том, что указатель стека не выровнен.

Если вы хотите, чтобы стек размером S вы установите sp в S мод 2 доказанным, что 2 < = S < = по 64Kb.
Вы можете проверить это правильно, записав пример с небольшим значением для S (скажем, 4).
Вы также можете проверить, что настройка sp на 0 даст вам стек 64KiB, который является самым большим размером, естественно доступным в реальном режиме.

+0

Будет ли поднят #GP в реальном режиме? Что должно произойти при выбросе исключения? Кажется, я не могу запустить его в моем загрузчике, поскольку байт over/underflow просто теряется. – user2725580

+0

@ user2725580 AFAIR (и, как сказано в руководстве Intel), он должен быть поднят. #GP is int 13. Сработает ли он? Я проверю это позже и в конечном итоге обновить ответ. Дайте мне знать, если у вас есть понимание. –

+0

@ user2725580 Это исключение SS! Я обновлю ответ через минуту –