Лекс Айрин писал(а):Дож писал(а):Как видим, в трёх случаях ни разу значение не возвращалось через стек.
Что ж, ошибся. Про регистры то я и забыл... Впрочем, это, на самом деле, мало что меняет -- если присмотреться, то все переменные хранятся в стеке.
«на самом деле, мало что меняет»? Вы действительно так считаете?
У Вас очень детское и наивное представление: будто бы общее почти всегда можно познать на основе частных случаев. «Если придумали алгоритм в простом случае, то легко доработаем до более сложного случая». «Если решили простую задачу, то без проблем решим и усложнённую версию». Теперь вот общие выводы делаем на основе каких-то ассемблерных кодов, которые я получил. Это всё неверные логические переходы — такие рассуждения не работают! От S=ab до взятия интегралов нужно проделать огромную работу.
Говоря про возвращение значений, есть ещё куча факторов, которые Вы не учитываете. Среди них архитектура процессора, операционная система, и, например, оптимизации (fpc -O3):
Код: Выделить всё
.section .text.n_p$program_$$_func_register_int$longint$longint$$longint,"x"
.balign 16,0x90
.globl P$PROGRAM_$$_FUNC_REGISTER_INT$LONGINT$LONGINT$$LONGINT
P$PROGRAM_$$_FUNC_REGISTER_INT$LONGINT$LONGINT$$LONGINT:
# Var A located in register eax
# Var B located in register edx
# Var $result located in register eax
# [15] begin
# [16] Result := A + B;
leal (%eax,%edx),%eax // <-- Ну и где здесь ebp?
# Var $result located in register eax
# [17] end;
ret
(содержимое ebp практически сразу же становится равным esp ). А после присваивания принадлежащий функции участок стека удаляется.
Это не имеет отношения к делу. Функция начинает завершать своё выполнение в тот момент, когда начинает выполняться инструкция ret, и завершает его в тот момент, когда ret отработало. То, что было перед всем этим — это внутренняя кухня данной конкретной функции, она никому ничем не обязана в достижении поставленных целей. Она должна вернуть вызывающему коду значение в EAX, а что она там по ходу дела кладёт или не кладёт в стек — это уже отдельный вопрос. Анализировать эту внутреннюю кухню и выискивать в ней какой-то глубинный смысл об истинном положении вещей — ошибка.
Может быть, поправите формулировку в
http://freepascal.ru/forum/viewtopic.php?f=2&t=10858&start=15#p92264? Потому что для частного случая, который я привёл для рассмотрения
Код: Выделить всё
var
X: LongInt = 0;
Y: LongInt = 0;
function GetRandom: LongInt;
begin
Inc(X);
Y := Y + X;
Result := X*Y;
end;
по Вашему разбору, переменная GetRandom «находится (после окончания работы функции) на вершине стека», а её адрес «либо ее непосредственное значение, либо ссылка на него», — лично для меня это звучит как набор слов.
И лучше вообще уйти от ассемблера, деталей реализации и прочих лишних сущностей, особенно если Вы в них плаваете, и сформулировать что-то в рамках языка паскаль (как пример: «переменная GetRandom — это Result после окончания работы функции, без этой псевдопеременной невозможно реализовать функцию как конструкцию, она временная, не описана, но к ней реально получить доступ, и она называется GetRandom и т.д.»).
Добавлено спустя 7 минут 10 секунд:vitaly_l писал(а):sign писал(а):Нельзя изменить Pi, поскольку это соотношение из физической реальности. Но, я согласен, вам, художникам, сие непонятно!
Физической или же всё таки геометрической???
Хотя, безусловно Вами приведён:
Весомый аргумент, но Вы заблуждаетесь.
Смотрите, меняю Пи и затем меняю в корне "всю" математику.
Допустим: Пи теперь не 3.14, а 6.28 (сокращено до 2 знака).
Теперь осмыслим: точность геометрии сохранится? <== Да/нет?
Безусловно ответ "Да", т.к. я всего лишь увеличил Пи в два раза.
Вы обещаете изменить всю математику, а на деле просто за PI обозначаете другое число.
Это как если бы я пообещал подарить миру новый язык по мотивам FPC, переработать ВЕСЬ ЯЗЫК, но единственное его отличие состояло бы в том, что вместо begin/end были бы слова start/finish. Т.е. я был бы балаболом.
Добавлено спустя 7 минут 43 секунды:Снег Север писал(а):Кстати, пока не забыл - Мамай и Дмитрий Донской один и тот же человек? :lol:
Всё-таки Фоменко и Носовский вносят свою пользу: они создали довольно обширную систему, в рамках которой задали историкам много очень даже правильных вопросов, перепроверили много источников, применили много теорий, начиная от откровенных бредней и заканчивая вполне логичными и правильными подходами. О чём они думают, когда сливают Мамая и Дмитрия, сложно судить, — но не исключено, что это такой маркетинговый способ встряхнуть историков и донести свои идеи.
А в данном случае пациент больше напоминает Рыбникова (который придумал русскую арифметику и русскую таблицу химических элементов):
https://www.youtube.com/watch?v=8-UTJFpnub8