С точки зрения программиста на ассемблере - это она и есть, поскольку, как Вы совершенно справедливо заметили, в ассемблере кроме подпрограмм более ничего нет (макросы не рассматриваем, потому что после компиляции они станут просто повторяющимися кусками кода в теле программы).COKPOWEHEU писал(а):Поскольку в ассемблере нет ничего более высокоуровневого, чем подпрограмма - это она и есть.
Но, тем не менее, этот вызываемый участок кода получает параметр на входе и возвращает параметр на выходе. То есть, имеет все атрибуты функции?
Пойдем далее - допустим, я пишу на Си для AVR и написал некую функцию. Отлично, но после компиляции она тоже превратится в блок команд на ассемблере, в котором, как мы знаем, никаких функций нет? А ведь непосредственно исполняться в вычислительном ядре будут машинные коды, эквивалент коих - ассемблер. Получается, там, где происходит непосредственное выполнение программы, никаких функций нет? На каком же этапе они исчезают?
Что значит "вручную"? Через регистр - это вручную? А через память (ОЗУ) - это не вручную? А какой вообще еще способ есть? Ну, через стек можно, но это капитально поизвращаться надо.COKPOWEHEU писал(а):Дело в том, что передача значений реализована вручную
Просто у компилятора есть раз и навсегда запрограммированный его создателями механизм передачи параметров в вызываемый участок кода - допустим, путем создания некоего массива данных в ОЗУ. И возврат значений делается также, создавая другой массив. Компилятор же только меняет размер этого массива в зависимости от количества и типа передаваемых и возвращаемых параметров.
Но человек, будучи умнее компилятора Си, программируя на ассемблере, может создать свой способ передачи данных, если данных немного. Например, так, как это показано в моем примере.
Я программирую на ассемблере. И этот пример в любом ассемблере скомпилируется правильно.COKPOWEHEU писал(а):то есть с одной версией компилятора она будет работать нормально, а с другой - нет.


