FramePointer (FP)
От: hamster0  
Дата: 06.07.05 10:15
Оценка:
Для чего в стеке находится framepointer? Если он нужен, то зачем тогда флаг -fomit-frame-pointer?
Re: FramePointer (FP)
От: vnp  
Дата: 06.07.05 18:34
Оценка:
Здравствуйте, hamster0, Вы писали:

H>Для чего в стеке находится framepointer? Если он нужен, то зачем тогда флаг -fomit-frame-pointer?


Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp. Это реализовано аппаратно. Но, так как вызывающая функция тоже однажды захочет вернуться, то еще до вызова она должна сохранить fp (в стеке). Это делается однажды, в прологе функции, еще до размещения локальных переменных, что, собственно, и образует фрейм.

Таким образом, если функция не собирается никого вызывать, фрейм ей не нужен. Для обнаружения этого факта требуется дополнительный анализ кода, который и включается флагом -fomit-frame-pointer.
Re[2]: FramePointer (FP)
От: Mab Россия http://shade.msu.ru/~mab
Дата: 06.07.05 19:18
Оценка:
vnp>Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp.
Что есть fp? Может имелся в виду e(bp)?

vnp>Это реализовано аппаратно.

Ну как сказать... стандартный пролог функции выглядит так
push ebp
mov ebp, esp

Так что скорее программно.
Re[3]: FramePointer (FP)
От: vnp  
Дата: 06.07.05 22:36
Оценка:
Здравствуйте, Mab, Вы писали:

vnp>>Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp.

Mab>Что есть fp? Может имелся в виду e(bp)?

fp имелся в виду frame pointer. На x68 он, действительно, e(bp). На других машинах, например, a6, или еще чего.

vnp>>Это реализовано аппаратно.

Mab>Ну как сказать... стандартный пролог функции выглядит так
Mab>
Mab>push ebp
Mab>mov ebp, esp
Mab>

Mab>Так что скорее программно.

Сорри, давно с интелем дела не имел. Опять-таки, link еще бывает. Но да, программное усилие все равно требуется.
Re[2]: FramePointer (FP)
От: hamster0  
Дата: 08.07.05 12:52
Оценка:
Здравствуйте, vnp, Вы писали:

vnp>Здравствуйте, hamster0, Вы писали:


H>>Для чего в стеке находится framepointer? Если он нужен, то зачем тогда флаг -fomit-frame-pointer?


vnp>Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp. Это реализовано аппаратно. Но, так как вызывающая функция тоже однажды захочет вернуться, то еще до вызова она должна сохранить fp (в стеке). Это делается однажды, в прологе функции, еще до размещения локальных переменных, что, собственно, и образует фрейм.


vnp>Таким образом, если функция не собирается никого вызывать, фрейм ей не нужен. Для обнаружения этого факта требуется дополнительный анализ кода, который и включается флагом -fomit-frame-pointer.


Я прочитала, что фреймы в стеке имеют такой вид:

|51|___________________|+++++++++++++++++|
|52|___________________|+++++++++++++++++|
|53|___________________|+++++++++++++++++|
|54|___________________|++++_func2_+++++++|
|55|______sfp=[60]______|++_stack_frame_++++|
|56|return_address=[61]__|+++++++++++++++++|
|57|_____arg21_________|____________________|
|58|_____local12________|+++++++++++++++++|
|59|_____local11________|++++_func1_+++++++|
|60|______sfp=[nn]______|++_stack_frame_++++|
|61|return_address=[nn]__|+++++++++++++++++|
|62|_____arg11_________|___________________|
|nn|rest_of_the_stack____|+++++++++++++++++|


но тогда получается, что fp сохраняется в стеке уже не в своем фрейме, а в вызванной функции? Тогда это образует новый фрейм... А если функция не собирается никого вызывать, то она и без флага -fomit-frame-pointer не будет сохранять fp?

Заранее большое спасибо за ответ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.