Я смущен этим, потому что, если у нас уже есть указатель, мы можем легко указать на следующую инструкцию, мы можем легко указать, чтобы вернуть предыдущую функцию, поэтому зачем нам нужен другой регистр указателя стека, чтобы вернуться к предыдущей функции или модулю ?Зачем нам нужен регистр стека, когда у нас уже есть регистр счетчика программ?
ответ
Счетчик программ сообщает CPU, где он находится is. Стек используется (среди прочего) вести запись о том, где он был.
Если функция вызывается, эта функция должна знать, где вернуться к ее завершению. Это действительно может быть просто адрес, который передается, но если эта функция сама вызывает другие функции или даже вызывает рекурсивно, тогда она должна гарантировать, что этот адрес не будет потерян или перезаписан, поэтому он должен быть сохранен. Естественным способом сделать это является толкание адреса в стек, и при необходимости он снова отбрасывается.
Конечно, он также сохраняет локальное состояние для функции, потому что это тоже нужно вытолкнуть и выскочить по мере того, как программа опускается или возвращается из функций.
Не все процессоры обязательно имеют стек, но если вы делаете что-либо удаленно сложным на одном, вы неизбежно реализуете его.
Программа conter сохраняет позицию следующей инструкции, указатель стека указывает на кучу (стек), где информация о хранилище процессора используется для последующего использования, например значения внутренних регистров перед тем, как перейти к подпрограмме.
SP используется для извлечения данных из регистра стека, где он хранит временные данные, такие как би-продукты любой операции или содержаний перед сбоем питания, чтобы восстановить его обратно
в то время как ПК, как и знает содержать адрес следующих инструкции для выполнения.
- 1. Зачем нам нужен analysis_export, когда у нас есть analysis_port
- 2. Зачем Haskell нужен Data.Sequence, когда у нас уже есть список?
- 3. Почему нам нужен интерфейс, когда у нас есть абстрактный класс?
- 4. Зачем нам нужен JavaFX, хотя у нас есть Swing?
- 5. Зачем нам нужен сервер Express, когда у нас уже есть готовый сервер
- 6. У нас уже есть nodejs, зачем нам nginx или apache?
- 7. Зачем нужен верхний регистр uuid?
- 8. Зачем нам JWT, когда у нас есть сеансы клиентов?
- 9. Зачем нам <form/>, когда у нас есть AJAX?
- 10. Зачем нам нужны драйверы, когда у нас есть ядро?
- 11. Зачем нам нужен RD/WR, когда у нас есть DT/R?
- 12. Зачем нам нужен файл .lib-заглушки, когда у нас есть реальная реализация .dll?
- 13. Зачем нам нужно распределение стека, когда у нас есть красная зона?
- 14. Зачем нам нужны синхронизированные ArrayLists, когда у нас уже есть Векторы?
- 15. MIPS: Зачем нам загружать байт, когда у нас уже есть загрузочное слово?
- 16. Зачем нам нужен обратный адрес?
- 17. Зачем нам нужен Ajax/jQuery, вызывающий метод colntroller, когда у нас уже есть функциональность по умолчанию, предоставленная MVC?
- 18. Зачем нужен Array, если у вас уже есть ArrayList?
- 19. Зачем использовать condition_variable, если у нас уже есть уведомляющая переменная?
- 20. Зачем нам нужен enabled_shared_from_this
- 21. Зачем нам нужна новая конструкция цикла для ES2015, если у нас уже есть, forEach?
- 22. Зачем нам Maven или Ant, если у нас уже есть Eclipse?
- 23. Зачем нужно использовать JsonRequestBehavior, если у нас уже есть [HttpPost]?
- 24. Зачем создавать коллекции, если у нас уже есть коллекция?
- 25. Зачем нам нужен contexClassLoader
- 26. Зачем нам нужен cmake?
- 27. Зачем нам нужен Control.Lens.Reified?
- 28. Зачем нам нужен конструктор?
- 29. Зачем нам нужен org.junit.ComparisonFailure?
- 30. Зачем нам нужен mktemp?
Возможный дубликат [Что такое указатель стека, используемый для микропроцессоров?] (http://stackoverflow.com/questions/1464035/what-is-a-stack-pointer-used-for- в-микропроцессоров) –