Постоянство стека сборки - PullRequest
1 голос
/ 11 апреля 2010

Я хотел бы знать, если после вызова функций данные в стеке являются постоянными. Например, я хотел бы знать, могу ли я (при условии соглашения cdecl) сделать это (независимо от того, что делается в функции X и независимо от оптимизаций):

push 1
push 2
push 3
call X
call X
call X
add 12 esp

Также предположим, что перед вызовами я сохраняю адрес, где помещенные значения находятся в глобальной переменной. Могу ли я, внутри X , изменить значения, содержащиеся в нем, путем доступа к глобальной переменной? Например, по какой-то причине я хочу, чтобы в X я мог изменять значения в стеке, чтобы второй и третий вызов X получал разные значения.

Ответы [ 2 ]

1 голос
/ 11 апреля 2010

В cdecl вызывающий очищает стек после того, как вызываемый возвращается. Возвращаемые значения помещаются в EAX, поэтому я думаю, что можно с уверенностью предположить, что вызывающая сторона может очистить стек, как вы описываете, иначе как cdecl будет работать на практике?

И да, X может изменить содержимое стека, если захочет. В сборке все открыто, правда, очень мало ограничений.

0 голосов
/ 11 апреля 2010

Да, вы можете сделать это с i386 cdecl (с x64 эти аргументы будут в регистрах.) Но почему? Не будет ли проще (и быстрее) сделать один call и цикл внутри функции? Вы бы сэкономили на ветвлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...