Size: a a a

Ассемблер

2020 May 12

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
поэтому есть для этих случаев cinvoke. для stdcall - есть invoke, для пользовательских функцийй - stdcall
источник

𝑀

𝑀𝓇. 𝐼𝓈𝓀𝒶𝓃𝒹𝒶𝓇... in Ассемблер
спасибо за обширную информацию)
источник

0

0xFF in Ассемблер
quavo
функция
Подпрограмма?
источник

楽園松本 in Ассемблер
0xFF
Подпрограмма?
Функция – это термин из языков высокого уровня. Для асма правильнее использовать термин процедура / подпрограмма, если речь идёт о логической организации.
источник

G

Gymmasssorla in Ассемблер
楽園松本
Функция – это термин из языков высокого уровня. Для асма правильнее использовать термин процедура / подпрограмма, если речь идёт о логической организации.
+
источник

G

Gymmasssorla in Ассемблер
Я тоже использую термин процедура/подпрограмма для процедурных языков. Логично же?)
источник

AG

Alexander Galileev in Ассемблер
Функция возвращает значение, а процедура - нет. И то, и то - подпрограммы.  Другое дело, что много зависит от традиций конкретного языка - в Си и то, и то называют функциями, в языке ассемблера - подпрограммами, и т.д.
источник

ST

Saenro T in Ассемблер
Чувак слева явно стебётся над тем кто справа. Сарказм налицо.
источник

H

HiLevel in Ассемблер
Saenro T
Чувак слева явно стебётся над тем кто справа. Сарказм налицо.
Вероятно да
источник

AB

Artöm Bakri Al-Sarmi... in Ассемблер
Aleksandr
внутри одного языка не используется более одного соглашения о вызовах. точнее, может, но для этого нужно намеренно указать такую фичу
В плюсах используется
источник

A

Aleksandr in Ассемблер
там же везде thiscall, нет?
источник

AB

Artöm Bakri Al-Sarmi... in Ассемблер
У свободных функций cdecl
источник

楽園松本 in Ассемблер
Alexander Galileev
Функция возвращает значение, а процедура - нет. И то, и то - подпрограммы.  Другое дело, что много зависит от традиций конкретного языка - в Си и то, и то называют функциями, в языке ассемблера - подпрограммами, и т.д.
Вопрос философский: что значит "возвращает значение"?
источник

楽園松本 in Ассемблер
Например в Си `void fn (int * n)`. Что она возвращает? И это функция или процедура?
источник

楽園松本 in Ассемблер
Если думать о сущностях, то сущность подпрограммы -- возможность быть вызванной внешней программой с таким расчётом, чтобы подпрограмма не знала об этом. То есть подпрограмма это такой код, который возможно вызывать снаружи кода подпрограммы, и который по окончании сам не передаёт управление вызывающему коду; за него это делает процессор.

Но чтобы реализовать такой подпрограммный код его необходимо особым образом написать.

Говоря о термине "функция", я думаю, мы обязательно подразумеваем формирование тн 'контекста функции'. То есть, для языков типа Си реализация подпрограммы происходит через создание контекста -- в стеке. Отсюда и особый термин "функция". В Си, как это я вижу, термин "подпрограмма" не применим.
источник

楽園松本 in Ассемблер
В реализациях на ассемблере мы используем макросы. Вот макрос уже уместно назвать функцией. Особенно, если в макросе мы создаём некоторый контекст вроде "сохранить регистры, сдвинуть указатель стека, ... , восстановить регистры, вернуть указатель стека, ret".
источник

AG

Alexander Galileev in Ассемблер
1) Подпрограмма - обособленный кусок кода, который вызывается во время работы основной программы или другой подпрограммы. Два ключевых момента:
а) Подпрограмма должна именно вызываться. В ассемблере для этого используется команда call, в Си - оператор вызова функции вида f(), причём этот оператор при трансляции на язык ассемблера превратится в ту же команду call с некоторыми сопутствующими действиями.
б) Для подпрограммы выделяется отдельный стековый кадр - с помещением в стек адреса возврата, по которому будет возвращаться управление в вызывающую программу после того, как подпрограмма отработает.

По этой причине макрос нельзя назвать функцией - даже если это макрос с параметрами. Макрос не вызывается и под него не выделяется стековый кадр. Более того, если говорить о чём-то вроде вызова макроса, то он происходит не во время работы программы - при работе программы никаких макросов нет. Макрос вызывается или выполняется (я не уверен насчёт этих терминов применительно к макросам, но пусть) на стадии работы препроцессора, т.е. даже до превращения исходного кода в машинный. После работы препроцессора от макросов не остаётся ничего.

2) Значение, которое возвращает функция, можно использовать в других операциях - арифметических, логических, присваивания и т.п. Для процедуры это невозможно. Например, в языке Pascal функции и процедуры объявляются по-разному, при этом ожидается, что функция таки какое-то значение вернёт, а процедура этого делать не станет. В Си объявление вида void f(){} по сути является объявлением процедуры, но называется такая конструкция всё равно функцией, уж не знаю, в силу традиций языка или каких-то иных причин.

В языках ассемблера различие между функцией и процедурой стирается. Существует соглашение, что если подпрограмма что-то возвращает, это значение нужно искать именно в регистре AX. Однако если в Си возвращение результата обозначается ключевым словом return, то на ассемблере программист сам должен следить, находится ли в AX какое-то осмысленное значение или просто мусор. Следовательно, правильнее будет использовать более общий термин "подпрограмма".
источник

楽園松本 in Ассемблер
Alexander Galileev
1) Подпрограмма - обособленный кусок кода, который вызывается во время работы основной программы или другой подпрограммы. Два ключевых момента:
а) Подпрограмма должна именно вызываться. В ассемблере для этого используется команда call, в Си - оператор вызова функции вида f(), причём этот оператор при трансляции на язык ассемблера превратится в ту же команду call с некоторыми сопутствующими действиями.
б) Для подпрограммы выделяется отдельный стековый кадр - с помещением в стек адреса возврата, по которому будет возвращаться управление в вызывающую программу после того, как подпрограмма отработает.

По этой причине макрос нельзя назвать функцией - даже если это макрос с параметрами. Макрос не вызывается и под него не выделяется стековый кадр. Более того, если говорить о чём-то вроде вызова макроса, то он происходит не во время работы программы - при работе программы никаких макросов нет. Макрос вызывается или выполняется (я не уверен насчёт этих терминов применительно к макросам, но пусть) на стадии работы препроцессора, т.е. даже до превращения исходного кода в машинный. После работы препроцессора от макросов не остаётся ничего.

2) Значение, которое возвращает функция, можно использовать в других операциях - арифметических, логических, присваивания и т.п. Для процедуры это невозможно. Например, в языке Pascal функции и процедуры объявляются по-разному, при этом ожидается, что функция таки какое-то значение вернёт, а процедура этого делать не станет. В Си объявление вида void f(){} по сути является объявлением процедуры, но называется такая конструкция всё равно функцией, уж не знаю, в силу традиций языка или каких-то иных причин.

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

Моя позиция такова: функция это абстракция языка программирования; подпрограмма - это аппаратная реализация выполнения участка кода с возвращением управления вызывающему коду.
источник

楽園松本 in Ассемблер
Alexander Galileev
1) Подпрограмма - обособленный кусок кода, который вызывается во время работы основной программы или другой подпрограммы. Два ключевых момента:
а) Подпрограмма должна именно вызываться. В ассемблере для этого используется команда call, в Си - оператор вызова функции вида f(), причём этот оператор при трансляции на язык ассемблера превратится в ту же команду call с некоторыми сопутствующими действиями.
б) Для подпрограммы выделяется отдельный стековый кадр - с помещением в стек адреса возврата, по которому будет возвращаться управление в вызывающую программу после того, как подпрограмма отработает.

По этой причине макрос нельзя назвать функцией - даже если это макрос с параметрами. Макрос не вызывается и под него не выделяется стековый кадр. Более того, если говорить о чём-то вроде вызова макроса, то он происходит не во время работы программы - при работе программы никаких макросов нет. Макрос вызывается или выполняется (я не уверен насчёт этих терминов применительно к макросам, но пусть) на стадии работы препроцессора, т.е. даже до превращения исходного кода в машинный. После работы препроцессора от макросов не остаётся ничего.

2) Значение, которое возвращает функция, можно использовать в других операциях - арифметических, логических, присваивания и т.п. Для процедуры это невозможно. Например, в языке Pascal функции и процедуры объявляются по-разному, при этом ожидается, что функция таки какое-то значение вернёт, а процедура этого делать не станет. В Си объявление вида void f(){} по сути является объявлением процедуры, но называется такая конструкция всё равно функцией, уж не знаю, в силу традиций языка или каких-то иных причин.

В языках ассемблера различие между функцией и процедурой стирается. Существует соглашение, что если подпрограмма что-то возвращает, это значение нужно искать именно в регистре AX. Однако если в Си возвращение результата обозначается ключевым словом return, то на ассемблере программист сам должен следить, находится ли в AX какое-то осмысленное значение или просто мусор. Следовательно, правильнее будет использовать более общий термин "подпрограмма".
То есть, для меня критерий считать что-либо функцией или не-функцией, не то, что эта функция/процедура возвращает или не возвращает, а то, о каком уровне реализации мы говорим. В Си для меня нет подпрограмм, но есть функции; в асме для меня нет функций, но есть подпрограммы.

Я могу создать квази-функции в асме -- с помощью макроса. То есть, это будет похоже на Си. Но так, пользуясь возможностями асмового препроцессора, можно воссоздать Си.
источник

AG

Alexander Galileev in Ассемблер
"Хочешь бессмысленно потратить время - затей спор о терминологии" (с) народная мудрость.
источник