#assembly #stack
#сборка #стек
Вопрос:
Ширина стека составляет 8 бит для архитектуры IA32 и для всех типов микропроцессоров / микроконтроллеров.
В данный момент я читаю http://ozark.hendrix.edu /~burch/csbsju/cs/350/handouts/x86.html о языке ассемблера. В объяснении «call» говорится, что указатель стека уменьшается на 4, а счетчик программ помещается в стек. Означает ли это, что ширина буфера стека составляет 8 бит, поскольку длина счетчика программ составляет 32 бита? Я пытался найти это в руководстве по разработке программного обеспечения для архитектуры intel IA32, но, похоже, не могу это подтвердить.
Спасибо Sziang
Ответ №1:
В архитектуре IA32 адресация памяти выражается в байтах.
Следовательно, чтобы поместить в стек еще 4 байта, вам нужно сдвинуть указатель стека на 4.
Комментарии:
1. У меня такое ощущение, что здесь либо бот с пониженным голосованием,либо где-то ошибка… Кажется, это происходит часто и внезапно.
2. Спасибо анону и шестеренчатому колесу, это тот ответ, который я ищу. с уважением, sziang
3. Правильно (чтобы поместить 4 байта в стек, указатель стека изменяется на 4), но не отвечает на вопрос.
Ответ №2:
Я впервые слышу о «ширине стека».
push /pop /call / ret имеют ширину по умолчанию (которая соответствует режиму работы процессоров). Но сам по себе стек не имеет ширины. (Выравнивание — это совершенно другая история.)
Из документации Intel (для push):
"In non-64-bit modes: if the address-size and operand-size attributes are 32,
the 32-bit ESP register (stack pointer) is decremented by 4.
If both attributes are 16, the 16-bit SP register (stack pointer)
is decremented by 2."
[…]
"In 64-bit mode, the instruction’s default operation size is 64 bits.
In a push, the 64-bit RSP register (stack pointer) is decremented by 8."
Для руководств (в которых всегда последнее слово) проверьте:
Руководства по процессорам Intel
Ответ №3:
Операции, которые помещают значения в «стек» для процессора x86 (например, операции, включающие ESP, такие как PUSH, вызов и т.д.), Все загружают с шагом в 4 байта. Эффективная ширина стека составляет 4 байта / 32 бита. Если вы кодируете для процессора x64, его ширина составляет 8 байт, но вы спрашивали об IA32.
У меня всегда указатель стека был выровнен по границе в 4 байта (DWORD). Я не знаю, можете ли вы выровнять стек с помощью DWORD и заставить его работать должным образом; если это произойдет, вы заплатите серьезным снижением производительности при доступе к памяти за нажатия и всплывающие окна (что делается очень часто в реальном коде), потому что реальный процессор хочет читать небольшими порциями размером в две степени.
Комментарии:
1. Из справочного руководства Intel, описание PUSH-инструкции: там нет такой инструкции, как «push al». «push imm8» настраивает стек в соответствии с размером указателя стека: «Атрибут address-size сегмента стека определяет размер указателя стека (16, 32 или 64 бита) [страница 4-320, том B, справочник по набору инструкций]». Итак, если вы работаете в 16-разрядном режиме, он будет выдавать 16 бит, но я не считаю, что это режим «IA32», по крайней мере, не в духе вопроса. (Я не кодировал 16-битный stack push с 1987 года).
2. На самом деле, 1 — это тоже небольшая степень двойки 🙂 И я поражен, что вы точно знаете, в каком году вы в последний раз кодировали 16-разрядный push. Но 1 за то, что просветил меня. Я не понимал, что это 32-разрядные нажатия независимо от размера операнда. Думаю, я слишком долго был вне мира asm.
3. Довольно легко запомнить; в этом году я получил свой первый чип Pentium и настоящую коробку Unix. Больше никаких 16-битных файлов.
Ответ №4:
Это означает, что 8 бит — это наименьшая адресуемая единица памяти в наборе команд (байт). Все адреса памяти в IA32 представляют собой кратное 8 битам смещение в ОЗУ.
Комментарии:
1. @GJ Я ничего не говорил о ширине стека. Оператору было интересно, почему нажатие 32-битного значения переместило указатель стека на 4. Причина в том, что указатель стека хранит адрес памяти, а адреса памяти основаны на байтах. Мой ответ не является неправильным, и фактически запрашивающий принял почти идентичный ответ, который пришел за несколько секунд до моего.
2. @Cogwheel но вопрос заключался в следующем: какова ширина стека в архитектуре Intel IA32?
3. Когда вы отвечаете на вопрос, у вас есть два варианта: 1) узко интерпретировать вопрос на основе заголовка, игнорируя весь остальной контекст; 2) Прочитать весь пост задавшего вопрос и попытаться выяснить, какую концепцию высокого уровня они пытаются понять. Мы выбрали # 2, и вы проголосовали против нас за это.
4. @Cogwheel: причина, по которой я проголосовал против, заключается в том, что ответы неверны. Я ожидал, что некоторые в Stack Overflow знают, каким является программный стек. Но это, вероятно, другой вопрос для Stack Overflow!
5. @GJ: Опять вы, кажется, полностью упустили суть… Я отвечал на вопрос, который он написал в теле: «Означает ли это, что ширина буфера стека составляет 8 бит, потому что длина счетчика программ составляет 32 бита?»