Хлопок 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, который является самым большим размером, естественно доступным в реальном режиме.
Будет ли поднят #GP в реальном режиме? Что должно произойти при выбросе исключения? Кажется, я не могу запустить его в моем загрузчике, поскольку байт over/underflow просто теряется. – user2725580
@ user2725580 AFAIR (и, как сказано в руководстве Intel), он должен быть поднят. #GP is int 13. Сработает ли он? Я проверю это позже и в конечном итоге обновить ответ. Дайте мне знать, если у вас есть понимание. –
@ user2725580 Это исключение SS! Я обновлю ответ через минуту –