Переполнение стека микропроцессора 8086 - PullRequest
1 голос
/ 15 августа 2010

Как будет вести себя микропроцессор 8086, когда стек заполнен, и даже тогда я что-то вставлю в него?

Ответы [ 3 ]

3 голосов
/ 15 августа 2010

8086 не имеет «защищенного режима», поэтому нет «защитной страницы внизу стека», поэтому нет четко определенного исключения. Вместо этого ваше нажатие перезапишет любой код или данные, находящиеся ниже дна стека, что в конечном итоге (но не сразу) приведет к «неопределенному поведению», если этот код выполняется или эти данные используются.

3 голосов
/ 28 января 2011

На 8086 инструкция PUSH или неявное добавление в стек уменьшит регистр SP на два и сохранит соответствующее количество в SS: SP (т.е. 16 * SS + SP).Если регистр SP был $ 0000, данные перейдут к SS: $ FFFE.Если регистр SP был $ 0001, MSB данных перейдет к SS: $ 0000, а LSB перейдет к SS: $ FFFF.Процессор не будет обращать какого-либо особого внимания на обход стека.Хотя оборачивание стека, как правило, было бы плохо, в 8086-м существуют ситуации, когда его можно игнорировать, и это никак не повлияет.Например, если SS указал на 64 КБ ОЗУ, который не был нужен ни для чего другого, и программа, которая никогда не собиралась выходить, иногда перезапускалась, просто вызывая «main ()» без сброса стека, стек мог бы обернуться безвлияет на работу программы, поскольку все вычисления с эффективным адресом будут выполняться одинаково.

Обратите внимание, что на 80386 и более поздних процессорах поведение переполнения стека изменяется.PUSH, POP, CALL, RET и т. Д. Используют ESP, а не SP, а ESP переносится в $ FFFFFFFF, а не в $ FFFF.

3 голосов
/ 15 августа 2010

Нет конца.Я имею в виду, что стек в этих процессорах имеет обратный порядок (справа налево).Таким образом, это будет продолжаться вплоть до блока памяти или до конца памяти.Это вызывает исключение в процессоре, которое может выполнить программный сброс сам.

...