20.11.2017, 11:49
общий
это ответ
Здравствуйте, kerenskyaf!
Четное значение вершины стека в 16-битном режиме процессора, а ДОС-овские программы работают именно в 16-битном режиме,
необходимо для выравнивания адреса на слово. Процессоры х86 так устроены, что они работают лучше всего, если адреса памяти выровнены на разрядность процессора.
Обычно выравнивание памяти происходит компиляторами (при компиляции) и ОС (при выполнении) автоматически.
Строго говоря, в незащищенном 16-битном режиме будет работать и с нечетной границей, просто при обращении к памяти будет тратиться лишний такт.
А вот в защищенных 32- и 64-битных режимах (в Windows или Linux) предусмотрен режим контроля выравнивания, при котором произойдет исключение, т.е. аварийное завершение. Отсюда, в 32- и 64-битном режимах точно необходимо выравнивать память на 4 и 8 байт соответственно.
Именно поэтому память, и особенно стек, желательно выравнивать на необходимую величину.
Как справедливо заметил Зенченко К.Н.:
Само значение 0xFFFE получается потому, что при запуске программы значение вершины стека SP = 0
Потом загрузчик программы выполняет команду PUSH 0, чтобы в стеке оказался адрес 0,
по которому в начале программного сегмента записывается команда int 20h.
Это сделано, чтобы работала команда ret, по которой перейдет управление как раз на адрес 0 и выполнится int 20h
А после выполнения PUSH 0 и получается, что SP = 0xFFFE
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен