Size: a a a

Ассемблер

2020 May 12

楽園松本 in Ассемблер
Alexander Galileev
"Хочешь бессмысленно потратить время - затей спор о терминологии" (с) народная мудрость.
Интересно, что слово "термин" имеет тот же корень, что и "терминал" и "терминатор" -- то есть, нечто конечное. Здесь не спор о терминологии, а _соглашение_ о словах, которые становятся конечными смыслами, то есть "терминами".
источник

AG

Alexander Galileev in Ассемблер
> Мы вели разговор о терминологии, да?
> Здесь не спор о терминологии

Тебе не кажется, что ты немножечко противоречишь сам себе? :)
источник

楽園松本 in Ассемблер
Alexander Galileev
> Мы вели разговор о терминологии, да?
> Здесь не спор о терминологии

Тебе не кажется, что ты немножечко противоречишь сам себе? :)
Ничуть. Мы вели не спор, а разговор.
источник

AG

Alexander Galileev in Ассемблер
А тебя голыми руками не возьмёшь, да ))))
источник

楽園松本 in Ассемблер
Alexander Galileev
А тебя голыми руками не возьмёшь, да ))))
Опыт многих лет
источник

楽園松本 in Ассемблер
Но вообще тема очень интересная.
источник

楽園松本 in Ассемблер
Например, если я программирую на асме, я не стану делать подпрограмму с контекстом. Я скорее всего на этапе разработки продумаю некие глобальные переменные, то есть области памяти, через которые буду общаться с подпрограммой.
источник

楽園松本 in Ассемблер
А вот создание контекста для подпрограммы будет просто необходимо, если подпрограмму буду планировать вызывать рекурсивно.
источник

楽園松本 in Ассемблер
Я помню в школе у меня был очень умный приятель, программист на две головы выше чем все, кого я знал на тот момент. Так вот Женя написал программку, которая рисовала деревья. Весьма натурально выглядящие. Так впервые в жизни я узнал, что такое рекурсия. На тот момент времени я, который не знал ни Си, ни Паскаля, а только асм, даже представить не мог, как работает рекурсия.
источник

AG

Alexander Galileev in Ассемблер
В общем, главный неверный постулат вот здесь:

> подпрограмма - это аппаратная реализация выполнения участка кода

Подпрограмма - это и есть участок кода, который может вызываться многократно с возвращением управления. Подпрограмма не может быть реализована аппаратно. Аппаратная реализация возможна, например, для команды call - если она, как сложная команда, интерпретируется на уровне микроархитектуры.

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

AG

Alexander Galileev in Ассемблер
Иными словами, "функция" и "процедура" являются непересекающимися подмножествами множества "подпрограмма".
источник

楽園松本 in Ассемблер
Alexander Galileev
В общем, главный неверный постулат вот здесь:

> подпрограмма - это аппаратная реализация выполнения участка кода

Подпрограмма - это и есть участок кода, который может вызываться многократно с возвращением управления. Подпрограмма не может быть реализована аппаратно. Аппаратная реализация возможна, например, для команды call - если она, как сложная команда, интерпретируется на уровне микроархитектуры.

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

Конечно, более корректно было бы с моей стороны сказать, что не подпограмма, а её вызов, является аппаратной реализацией.

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

楽園松本 in Ассемблер
Alexander Galileev
В общем, главный неверный постулат вот здесь:

> подпрограмма - это аппаратная реализация выполнения участка кода

Подпрограмма - это и есть участок кода, который может вызываться многократно с возвращением управления. Подпрограмма не может быть реализована аппаратно. Аппаратная реализация возможна, например, для команды call - если она, как сложная команда, интерпретируется на уровне микроархитектуры.

Подпрограммы же бывают двух типов - возвращающие значения (функции) и не возвращающие (процедуры). Любая функция является подпрограммой. Макрос не является ни подпрограммой, ни функцией - это совсем из другой оперы, вне зависимости от того, насколько он работает "похоже на Си".
Касательно двух типов подпограмм: а) возвращающих; и б) невозвращающих значения.

Я считаю это уточнение непринципиальным. Даже на примере такой сишной функции:
void fn (int * a) {
*a = 100;
}

Считать это возвращающей функцией? Вроде нет. Но явно, она меняет что-то. А значит, всё-таки возвращает.
источник

AG

Alexander Galileev in Ассемблер
1) > Мои аргументы в пользу того

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

Я затрудняюсь вести спор разговор на эту тему. Подпрограмма - кусок кода. Аппаратная реализация тут ни при чём. Адрес возврата сохраняется в стеке при вызове подпрограммы, но даже если он будет сохраняться где-то в другом месте - подпрограмма всё равно будет куском кода.

2) > Я считаю это уточнение непринципиальным

Опять же аргументы как в диалоге в пункте 1). Считать ты можешь что угодно (без обид), но общепринятое различие между функцией и процедурой именно в том, возвращает ли она что-то.

int f(int *a){ *a = 100; return *a; }
void p(int *a){ *a = 100; }


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

int b, c;

b = f(a);
c = f(a) + 100;


Написать же

int d;
d = p(a);


ты не можешь, потому что функция (процедура) p значение не возвращает.
источник

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

AG

Alexander Galileev in Ассемблер
楽園松本
Что является предметом нашего спора?
Разве мы спорим? Я думал, мы разговариваем.
источник

楽園松本 in Ассемблер
Alexander Galileev
Разве мы спорим? Я думал, мы разговариваем.
Сейчас мне уже начло казаться, что возникает спор.

Я выскажу своё понимание: в программе на ассемблере нет функций; в программе на Си нет подпрограмм. Функция и подпрограмма - это вещи разных порядков.

Ты с этим согласен?
источник

d

damagekidϡ in Ассемблер
источник

AG

Alexander Galileev in Ассемблер
Вообще, спора у нас действительно нет. Я сейчас (снова) отвечу на твой вопрос и пойду с чистой совестью пить чай. :)

Функция является частным случаем подпрограммы. И то, и другое является категориями программирования, а вовсе не аппаратного обеспечения.

На этом всё. Здоровья и хорошего настроения. :)
источник

楽園松本 in Ассемблер
Если подпрограмма не является категорией аппаратного обеспечения, то как же сделать универсальный вызов подпрограммы, не используя аппаратную реализацию, то есть без call / ret?

Вопрос подвисает в воздухе, тк разговор ты закрыл.
источник