Здравствуйте, hamster0, Вы писали:
H>Для чего в стеке находится framepointer? Если он нужен, то зачем тогда флаг -fomit-frame-pointer?
Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp. Это реализовано аппаратно. Но, так как вызывающая функция тоже однажды захочет вернуться, то еще до вызова она должна сохранить fp (в стеке). Это делается однажды, в прологе функции, еще до размещения локальных переменных, что, собственно, и образует фрейм.
Таким образом, если функция не собирается никого вызывать, фрейм ей не нужен. Для обнаружения этого факта требуется дополнительный анализ кода, который и включается флагом -fomit-frame-pointer.
vnp>Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp.
Что есть fp? Может имелся в виду e(bp)?
vnp>Это реализовано аппаратно.
Ну как сказать... стандартный пролог функции выглядит так
Здравствуйте, 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 еще бывает. Но да, программное усилие все равно требуется.
Здравствуйте, vnp, Вы писали:
vnp>Здравствуйте, hamster0, Вы писали:
H>>Для чего в стеке находится framepointer? Если он нужен, то зачем тогда флаг -fomit-frame-pointer?
vnp>Чтобы инструкция ret отработала правильно, стек должен указывать на положение адреса возврата. По ходу исполнения функции stack pointer плавает непредсказуемо. Поэтому это положение (значение sp момент вызова) сохраняется в fp. Это реализовано аппаратно. Но, так как вызывающая функция тоже однажды захочет вернуться, то еще до вызова она должна сохранить fp (в стеке). Это делается однажды, в прологе функции, еще до размещения локальных переменных, что, собственно, и образует фрейм.
vnp>Таким образом, если функция не собирается никого вызывать, фрейм ей не нужен. Для обнаружения этого факта требуется дополнительный анализ кода, который и включается флагом -fomit-frame-pointer.
но тогда получается, что fp сохраняется в стеке уже не в своем фрейме, а в вызванной функции? Тогда это образует новый фрейм... А если функция не собирается никого вызывать, то она и без флага -fomit-frame-pointer не будет сохранять fp?