| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Linux/Unix > Обьясните про стек в линуксе |
| Автор: vngrdserg 13.9.2005, 22:06 | ||
Не пойму как работает стек :
1. Какую функцию выполняют регистры esp , ebp ? 2. Смысл команды movl $10, -4(%ebp) ? |
| Автор: adejneka 15.9.2005, 05:31 | ||||||
При входе в функцию в ESP хранится адрес первого аргумента. Внутри функции - указатель на вершину стека. EBP указывает на начало фрейма стека текущей функции; выше располагаются аргументы текущей фукнции, ниже - переменные, временные объекты, аргументы функций, вызываемых из текущей.
Присвоить первой переменной значение 10. Насколько я понимаю, Вы привели оттранслированный код такой функции:
Вообще, поищите "System V Application Binary Interface". |
| Автор: vngrdserg 16.9.2005, 19:15 |
| Дело в том , что я перехожу с интеловского синтаксиса на айти-шный И меня в смущение привели 3 момента 1. перед регистром обязателен знак процента 2. Квадратные скобки в адресации поменяли на круглые 3. Интеловское [ebp-4] равносильно at-шному -4(%ebp) |
| Автор: oleg1973 16.9.2005, 20:00 |
| ну так есть под линюх асм компиляторы с интеловским синтаксисом |
| Автор: vngrdserg 18.9.2005, 14:12 | ||
| С регистром esp понятно - это текущий указатель стека Я не пойму , зачем нужен регистр ebp В этом смысле не понятна конструкция , которая существует при вызове процедур :
|
| Автор: adejneka 18.9.2005, 20:21 | ||
Так удобнее адресовать локальные переменные - их положение относительно начала кадра не меняется, а вот положение относительно подвижного верха стека - меняется. Кроме того, если Вы выделяется в стеке память переменного размера, используя псевдофункцию alloca, то адресация относительно EBP еще и более эффективна. |
| Автор: Guest 7.10.2005, 19:23 |
| Регистр bp можно использовать для того , чтобы получить доступ к данным в стеке по смещению , например [bp+2] А у меня такой вопрос : написано , что в sp хранится текущий указатель стека Что это означает ? Если я допусти добавляю число в стек , то соответсвенно и указатель перемещается вниз, а при извлечении числа вверх ? Т е можно ли изменить значение sp , кроме как командой push или pop ? И указывает ли sp всегда на последнее добавленное значение в стек ? |
| Автор: oleg1973 7.10.2005, 19:54 | ||
| да sp указывает на последнее добавленое в стек значение НО добавленное "легальным" способом типа push , call и так далее к примеру ничто не мешает сделать так
в данном случае на стек ложится адрес my_proc2 и возвратпроизойдет на этот адрес тоесть можно добавить число в стек не меняя сам sp главное не запутатся ) |
| Автор: Гость_guest 9.10.2005, 14:58 | ||
Сам sp тоже можно изменить , например так :
|
| Автор: regis 12.12.2005, 15:50 | ||
> А у меня такой вопрос : >написано , что в sp хранится текущий указатель стека >Что это означает ? Ну, если честно, именно это и означает ;) > Если я допусти добавляю число в стек , то соответсвенно и указатель перемещается вниз, >а при извлечении числа вверх ? Да. По соглашению все, что использует системный стек -- push/pop, call/ret, прерывания работают именно так. > Т е можно ли изменить значение sp , кроме как командой push или pop ? Да можно. В коде, приведенном сверху, есть прекрасный пример этого: sub #4, %esp. > И указывает ли sp всегда на последнее добавленное значение в стек ? Как ясно из приведенного примера, это, вообще-то говоря, неверно. Верно то, что [e]sp -- всегда указатель на вершину стека. |
| Автор: sgi1981 28.3.2006, 15:49 | ||||
Человек хотел задать вопрос так. Для чего регистр общего назначения esp хранит смещение в сегменте стека ? А просто не смог сформулировать свой вопрос. Разработчики микропроцессора решили использовать в архитектуре процессора этот регистр для команд процессора, использующих стек. Таких как call ret pop popf popfd popa popad push pusha pushad pushf pushfd enter leave Регистр esp был выбран для использования этими командами: для того чтобы ячейка памяти для хранения адреса точки возврата или временного хранения переменных или сохранения флагов при вызове подпрограммы обработки прерывания смогла использоваться неявно. В esp хранится смещение в сегменте стека, и при использовании этих команд смещение в машинной команде указывать не нужно. Тем самым уменьшается размер машинного кода. Возникает вопрос. А для чего тогда был выделен ещё один регистр общего назначения ebp ? Несмотря на то, что esp хранит некоторое значение смещения в сегменте стека, его использование в подпрограммах для адресации локальных переменных не всегда оправдано, потому что значение этого регистра может быть изменено за счет инструкций извлечения и размещения операндов в стеке во время выполнения подпрограммы. При записи операнда в стек командой типа push значение esp уменьшается на 4 или 2 байта, в зависимости от значения атрибута размера адреса. При извлечении операнда из стека командой типа pop значение esp увеличивается на 4 или 2 байта, в зависимости от значения атрибута размера адреса. |