 |

19.10.2021, 05:08
|
|
Новичок
Регистрация: 14.10.2021
Сообщений: 3
С нами:
2412860
Репутация:
1
|
|
Я прочитал и понял, что это соглашение о вызовах делает так, что аргументы функции приходят в стек в обратном порядке, а целостность стека сохраняет вызывающий код. Но для чего это нужно? Кому и зачем это может понадобиться?
|
|
|

19.10.2021, 09:13
|
|
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами:
4609424
Репутация:
183
|
|
Сообщение от Fdsiyhu
Кому и зачем это может понадобиться?
Компьютеру, чтобы стек не переполнился и приложение не вылетело.
Компьютеру, чтобы понимать, откуда что брать: из ecx, edx, или из локального стека
Например, методы классов используют thiscall, в таком режиме в первый невидимый аргумент (регистр ecx) пихается указатель на наш класс.
|
|
|

19.10.2021, 09:20
|
|
Постоянный
Регистрация: 21.08.2015
Сообщений: 343
С нами:
5646349
Репутация:
163
|
|
варарги
|
|
|

19.10.2021, 11:55
|
|
Познающий
Регистрация: 06.09.2018
Сообщений: 32
С нами:
4045092
Репутация:
23
|
|
Вот зачем - старая добрая вики
Плюс, как выше написали, cdecl функция, по причине того, что стек чистит самостоятельно caller, может использовать вариадики - цппреф
Сообщение от #Northn
Компьютеру, чтобы стек не переполнился и приложение не вылетело.
Компьютеру, чтобы понимать, откуда что брать: из ecx, edx, или из локального стека
Например, методы классов используют thiscall, в таком режиме в первый невидимый аргумент (регистр ecx) пихается указатель на наш класс.
При чем здесь переполнение стека? Соглашение о вызовах к этому вообще ни малейшего отношения не имеет
И нету никакого локального стека, а есть область для локальных переменных в стеке (которую часто называют локал стеком, да), которая расположена в стековом фрейме функции, но аргументы, переданные функции, оттуда не берутся
"Например, методы классов используют thiscall" - а в POSIX? Правильно, __cdecl.
И аргумент вполне себе видимый
|
|
|

19.10.2021, 13:53
|
|
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами:
4609424
Репутация:
183
|
|
Сообщение от .deserve
При чем здесь переполнение стека?
C++:
Код:
void
__cdecl
a
(
int
b
,
int
c
,
int
d
,
int
e
)
{
}
int
main
(
)
{
while
(
1
)
reinterpret_cast
(
void
(
__thiscall
*
)
(
int
,
int
,
int
,
int
)
(
a
)
(
1
,
2
,
3
,
4
)
;
}
Давай.
|
|
|

19.10.2021, 15:10
|
|
Познающий
Регистрация: 06.09.2018
Сообщений: 32
С нами:
4045092
Репутация:
23
|
|
Сообщение от #Northn
C++:
Код:
void
__cdecl
a
(
int
b
,
int
c
,
int
d
,
int
e
)
{
}
int
main
(
)
{
while
(
1
)
reinterpret_cast
(
void
(
__thiscall
*
)
(
int
,
int
,
int
,
int
)
(
a
)
(
1
,
2
,
3
,
4
)
;
}
Давай.
Ты делаешь вложенные вызовы функции, вызывающие переполнение стека. А происходит это из-за "бесконечного" добавления фрейма активации. Зачем ты сюда соглашения о вызовах приплёл одному тебе известно. (читай upd) К тому же на цланге ты варнинг получишь по вызову cdecl функции через thiscall с игнором параметров.
upd. Да, при вызове аргументы остаются не очищенным как раз благодаря вызову функции через thiscall, которая сама должна их чистить. Не видел до этого, чтобы так стек переполняли. Интересно.
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|