Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обьясните про стек в линуксе 
:(
    Опции темы
vngrdserg
Дата 13.9.2005, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.9.2005

Репутация: нет
Всего: нет



Не пойму как работает стек :
Код

.globl main
 main:
   call foo
   ret
 foo:
   pushl %ebp
   movl %esp, %ebp
   subl $4, %esp
   movl $10, -4(%ebp)
   movl %ebp, %esp
   popl %ebp
   ret



1. Какую функцию выполняют регистры esp , ebp ?
2. Смысл команды movl $10, -4(%ebp) ?

Это сообщение отредактировал(а) vngrdserg - 13.9.2005, 22:07
PM MAIL   Вверх
adejneka
Дата 15.9.2005, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: нет
Всего: 11



Цитата

1. Какую функцию выполняют регистры esp , ebp?

При входе в функцию в ESP хранится адрес первого аргумента. Внутри функции -
указатель на вершину стека.

EBP указывает на начало фрейма стека текущей функции; выше располагаются
аргументы текущей фукнции, ниже - переменные, временные объекты, аргументы
функций, вызываемых из текущей.

Цитата

2. Смысл команды movl $10, -4(%ebp)

Присвоить первой переменной значение 10.

Насколько я понимаю, Вы привели оттранслированный код такой функции:

Код

void foo ()
{
  int x = 10;
}


Вообще, поищите "System V Application Binary Interface".
PM MAIL   Вверх
vngrdserg
Дата 16.9.2005, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.9.2005

Репутация: нет
Всего: нет



Дело в том , что я перехожу с интеловского синтаксиса на айти-шный
И меня в смущение привели 3 момента
1. перед регистром обязателен знак процента
2. Квадратные скобки в адресации поменяли на круглые
3. Интеловское
[ebp-4]
равносильно at-шному
-4(%ebp)

PM MAIL   Вверх
oleg1973
Дата 16.9.2005, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



ну так есть под линюх асм компиляторы с интеловским синтаксисом



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
vngrdserg
Дата 18.9.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 13.9.2005

Репутация: нет
Всего: нет



С регистром esp понятно - это текущий указатель стека
Я не пойму , зачем нужен регистр ebp
В этом смысле не понятна конструкция , которая существует при вызове процедур :
Код

...
gosub_01:
        pushl   %ebp            
        movl    %esp,%ebp
        ......
        movl %ebp,%esp     
        popl %ebp
        ret


Это сообщение отредактировал(а) vngrdserg - 18.9.2005, 14:13
PM MAIL   Вверх
adejneka
Дата 18.9.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: нет
Всего: 11



Цитата(vngrdserg @ 18.9.2005, 14:12)
Я не пойму , зачем нужен регистр ebp

Так удобнее адресовать локальные переменные - их положение относительно начала кадра не меняется, а вот положение относительно подвижного верха стека - меняется. Кроме того, если Вы выделяется в стеке память переменного размера, используя псевдофункцию alloca, то адресация относительно EBP еще и более эффективна.
PM MAIL   Вверх
Guest
Дата 7.10.2005, 19:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Регистр bp можно использовать для того , чтобы получить доступ к данным в стеке
по смещению , например
[bp+2]
А у меня такой вопрос :
написано , что в sp хранится текущий указатель стека
Что это означает ?
Если я допусти добавляю число в стек , то соответсвенно и указатель перемещается вниз,
а при извлечении числа вверх ?
Т е можно ли изменить значение sp , кроме как командой push или pop ?
И указывает ли sp всегда на последнее добавленное значение в стек ?
  Вверх
oleg1973
Дата 7.10.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



да sp указывает на последнее добавленое в стек значение
НО добавленное "легальным" способом типа push , call и так далее
к примеру ничто не мешает сделать так
Код

call my_proc1
........................

my_proc1:
                   mov eax, my_proc2
                   xchg [esp],eax
                   ret
my_proc2:

в данном случае на стек ложится адрес my_proc2
и возвратпроизойдет на этот адрес

тоесть можно добавить число в стек не меняя сам sp
главное не запутатся )


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Гость_guest
Дата 9.10.2005, 14:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сам sp тоже можно изменить , например так :
Код

         add ,sp,4

  Вверх
regis
Дата 12.12.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



Цитата(Guest @ 7.10.2005, 19:23)
Регистр bp можно использовать для того , чтобы получить доступ к данным в стеке
по смещению , например
[bp+2]
А у меня такой вопрос :
написано , что в sp хранится текущий указатель стека
Что это означает ?
Если я допусти добавляю число в стек , то соответсвенно и указатель перемещается вниз,
а при извлечении числа вверх ?
Т е можно ли изменить значение sp , кроме как командой push или pop ?
И указывает ли sp всегда на последнее добавленное значение в стек ?

> А у меня такой вопрос :
>написано , что в sp хранится текущий указатель стека
>Что это означает ?

Ну, если честно, именно это и означает ;)

> Если я допусти добавляю число в стек , то соответсвенно и указатель перемещается вниз,
>а при извлечении числа вверх ?

Да. По соглашению все, что использует системный стек -- push/pop, call/ret, прерывания работают именно так.

> Т е можно ли изменить значение sp , кроме как командой push или pop ?

Да можно. В коде, приведенном сверху, есть прекрасный пример этого: sub #4, %esp.

> И указывает ли sp всегда на последнее добавленное значение в стек ?

Как ясно из приведенного примера, это, вообще-то говоря, неверно.
Верно то, что [e]sp -- всегда указатель на вершину стека.

--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
sgi1981
Дата 28.3.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



Цитата

Цитата
> А у меня такой вопрос :
>написано , что в sp хранится текущий указатель стека
>Что это означает ?

Ну, если честно, именно это и означает ;)


Человек хотел задать вопрос так.
Для чего регистр общего назначения 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 байта, в зависимости от значения атрибута размера адреса.


Это сообщение отредактировал(а) sgi1981 - 28.3.2006, 15:52


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Linux/Unix"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Linux/Unix | Следующая тема »


 




[ Время генерации скрипта: 0.1370 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.