Обработка стека в микропроцессоре 8085
Если в 8085 SP=0000H, какие регистры в каких ячейках памяти будут храниться при выполнении инструкции PUSH B?
Будет ли содержимое регистра B храниться в FFFF, а C - в FFFE?
3 ответа
(Edited)
Аааа, теперь я вижу вопрос.
Конечно, обычно это не та ситуация, которая возникает в реальном коде. В этой архитектуре код обычно загружается, начиная с нехватки памяти, с данными и стеком выше, поэтому программа будет перезаписана, прежде чем вы сможете спровоцировать эту ситуацию.
В официальных технических паспортах Intel или в любой другой документации, которую я обнаружил, нет указаний на то, что прерывание срабатывает при переполнении указателя стека.
Таким образом, я действительно ожидал бы, что инструкция увеличивает / уменьшает регистр SP без какой-либо попытки проверки на переполнение, поэтому адресация памяти действительно изменится с 0000 на FFFF. Поскольку поведение не определено, у производителя нет оснований тратить впустую тестирование вентилей для этого случая и обрабатывать его любым другим способом.
Тем не менее, официальный ответ может быть, что это неуказанное поведение. Чтобы понять это, вы должны найти заявление от Intel, которая изначально разработала эту архитектуру. Я провел небольшой поиск (как отмечено выше), но я просто не вижу ничего абсолютного.
Поскольку я не вижу никакой причины, по которой это могло бы возникнуть при нормальных обстоятельствах, или какой-либо пользы для провокации этого... Я испытываю соблазн свести все вышеперечисленное к суммированию дзен "Му".
Поэтому, чтобы ответить на этот вопрос, нам нужно по-настоящему понять, как на самом деле работает инструкция PUSH в 8085 году. Рассмотрим следующую ситуацию:
Register B has contents 0xAA
Register C has contents 0xBB
SP = 0x0000
Теперь давайте предположим, что встреченная инструкция - это PUSH. Инструкция PUSH сначала уменьшает указатель стека SP
B -> 0xAA
C -> 0xBB
SP -> 0xFFFF
а затем сохраняет регистр более высокого порядка, снова уменьшается, а затем сохраняет также регистры более низкого порядка.
B -> 0xAA
C -> 0xBB
0xFFFF -> 0xAA
0xFFFE -> 0xBB
SP -> 0xFFFE
Содержимое регистра B будет загружено по адресу памяти FFFFH, а содержимое регистра C — по адресу памяти FFFEH.