2014-12-03 2 views
2

Почему инструкция PUSHAD хранит ESP? Если я хочу использовать POPAD для восстановления ESP, я должен знать правильное содержание ESP, прежде чем использовать POPAD. Кажется бесполезным хранить ESP в PUSHAD.Почему PUSHAD дает инструкции ESP?

Может ли кто-нибудь дать какое-нибудь объяснение? Благодарю.

+2

Потому что для этого потребовалось меньше транзисторов, чтобы реализовать его 32 года назад, позволяя простую копию банка регистров. Напротив, вы должны * никогда не использовать эту инструкцию. Он был полностью исключен в x64. –

ответ

1

Согласно моим исследованиям, инструкция PUSHA была введена в 1982 году в процессор Wikipedia: Intel 80286.

Документ "Intel 80286 Programmer's Reference Manual 1987" объясняет это назначения, используя слова:

... PUSHA (Push Все Регистры) сохраняет содержимое восьми общих регистров в стеке ... Эта команда упрощает вызовы процедур за счет сокращения количество инструкций, необходимых для сохранения содержимого общих регистров для использования в процедуре. PUSHA это дополняется Попа ...

... POPA (Pop Все Регистры) выскакивает восемь регистров общего назначения, указанные в приведенном выше описании, за исключением того, что значение SP отбрасывается вместо загружен в SP. POPA меняет предыдущую Пущу, восстановление регистров общих с их значениями перед тем Пуща была выполнен ...

... Прерывание Процедуры обслуживания может повлиять на другие, чем другой IP, CS, и ФЛАГИ регистров. Подпрограмма прерывания должна сохранять дополнительную информацию контекста перед продолжением, чтобы состояние машины можно было восстановить по завершении процедуры обслуживания прерываний (инструкции PUSHA и POPA предназначены для этих операций). Наконец, выполнение команды IRET выталкивает старый IP, CS и ФЛАГИ из стека и возобновляет выполнение прерванной программы ...

... В общем, разработчик системы может свободно использовать почти любые векторы прерываний для любой заданной цели. Однако некоторые из векторов с наименьшим номером - , зарезервированные Intel для специальных функций; их использование конкретно подразумевается по определенным типам исключений. Ни один из первых 32 векторов не должен быть , определенный пользователем; эти векторы либо вызываются заранее определенные исключениями или зарезервированы Intel для будущего расширения ...

Моего вольного перевода является то, что она должна быть простым способом создать снимок процессор «состояние» в точке времени, чтобы его можно было обработать обработчиками исключений и принять соответствующие корректирующие действия. Рассмотрение стеков кадров звонящего является одной из вещей, которые могут потребоваться.

После того, как это дизайнерское решение было принято, если практически фиксированными и замораживали до сегодняшнего дня, потому что «полностью обратно совместимые набор команд» является типичными характеристиками архитектуры x86 (см Wikipedia: x86, Wikipedia: x86-64)


delphifirst: Почему инструкция PUSHAD беспокоит хранение ESP?

Он делает это. Период.Почему инженеры 30 лет назад решили, что .. в настоящее время бессмысленный вопрос, не влияющий на программирование решений современных программистов

+1

Возможно, потому что в исходной реализации используется счетчик для перечисления регистров, а код для ESP оказался посередине - это счетчик. В этом случае разработчики будут вынуждены либо пропустить счет (ненужную избыточную логику), либо просто позволить процессору бесполезно нажимать ESP и использовать логику (меньшее количество ошибок), чтобы предотвратить загрузку ESP во время POPA. Только дикие предположения. –

+0

@IraBaxter [Руководства разработчика программного обеспечения для систем Intel® 64 и IA-32] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) по-прежнему классифицируют ' ESP' как «_General-Purpose Register_» и 'PUSHA/PUSHAD' были отчасти устаревшими:« _ .. Эта инструкция выполняется, как описано в режиме совместимости и унаследованного режима. Недействительно в 64-битном режиме. – xmojmr