HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 19.10.2021, 05:08
Fdsiyhu
Новичок
Регистрация: 14.10.2021
Сообщений: 3
С нами: 2412860

Репутация: 1
По умолчанию

Я прочитал и понял, что это соглашение о вызовах делает так, что аргументы функции приходят в стек в обратном порядке, а целостность стека сохраняет вызывающий код. Но для чего это нужно? Кому и зачем это может понадобиться?
 
Ответить с цитированием

  #2  
Старый 19.10.2021, 09:13
#Northn
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами: 4609424

Репутация: 183


По умолчанию

Цитата:
Сообщение от Fdsiyhu  

Кому и зачем это может понадобиться?
Компьютеру, чтобы стек не переполнился и приложение не вылетело.

Компьютеру, чтобы понимать, откуда что брать: из ecx, edx, или из локального стека

Например, методы классов используют thiscall, в таком режиме в первый невидимый аргумент (регистр ecx) пихается указатель на наш класс.
 
Ответить с цитированием

  #3  
Старый 19.10.2021, 09:20
memir
Постоянный
Регистрация: 21.08.2015
Сообщений: 343
С нами: 5646349

Репутация: 163
По умолчанию

варарги
 
Ответить с цитированием

  #4  
Старый 19.10.2021, 11:55
.deserve
Познающий
Регистрация: 06.09.2018
Сообщений: 32
С нами: 4045092

Репутация: 23
По умолчанию

Вот зачем - старая добрая вики

Плюс, как выше написали, cdecl функция, по причине того, что стек чистит самостоятельно caller, может использовать вариадики - цппреф

Цитата:
Сообщение от #Northn  

Компьютеру, чтобы стек не переполнился и приложение не вылетело.
Компьютеру, чтобы понимать, откуда что брать: из ecx, edx, или из локального стека
Например, методы классов используют thiscall, в таком режиме в первый невидимый аргумент (регистр ecx) пихается указатель на наш класс.
При чем здесь переполнение стека? Соглашение о вызовах к этому вообще ни малейшего отношения не имеет

И нету никакого локального стека, а есть область для локальных переменных в стеке (которую часто называют локал стеком, да), которая расположена в стековом фрейме функции, но аргументы, переданные функции, оттуда не берутся

"Например, методы классов используют thiscall" - а в POSIX? Правильно, __cdecl.

И аргумент вполне себе видимый
 
Ответить с цитированием

  #5  
Старый 19.10.2021, 13:53
#Northn
Флудер
Регистрация: 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
)
;
}


Давай.
 
Ответить с цитированием

  #6  
Старый 19.10.2021, 15:10
.deserve
Познающий
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.