ARV писал(а):да и в ассемблере показанный вами пример полезен только при острой нехватке памяти... или при "спортивном" программировании
Ну, в общем-то, да, хотя однажды, когда я что-то впихивал в какую-то мелкую тиньку, это было в тему. Кстати, этот приём я не сам сочинил. Так вполне официалльно рекомендовалось делать в руководстве по программированию для PDP-11, но годится оно практически, для любой машинки со стеком.
А тот прием, с которого я включился в дискуссию - выход из драйвера путем вызова процедуры выхода, как сопрограммы с манипуляциями стеком, я сочинил сам, модифицируя драйвер простого матричного принтера для наших клонов PDP-11. Казалось бы банальность: отправил в порт данных очередной байт, и жди следующего прерывания. Как говорит молодёжь, "Ага, щазз!.." Во-первых оно буферизованное, т.е., пока не забит буфер, только переслал байт, оно уже готово к приему следующего, а, значит, выходить и ждать прерывания - напрасная потеря времени.
Во-вторых, есть некоторые служебные символы и пр ним нужны некоторые специфические действия. Тот же символ горизонтальной табуляции (HT), который может либо отрабатываться аппаратно и тогда его надо просто отослать на принтер, либо программно, тогда вместо него надо выдать от одного до восьми пробелов. Или символ "новая страница" (FF) - надо отдать либо его, либо прогнать лист символами перевода строки.
А, в третьих, появились принтеры с другими кодировками и понадобилось перекодировать русские буквы. А еще у них была графика, и там, естественно, никаких перекодировок быть не должно. И вот, получили мы прерывание, спрашивается, что пересылать? Ладно, HT и FF там в оригинале как-то прикрутили, но разбираться с графикой и перекодировкой тем же способом - застрелиться. Прикручивать машину состояний - но там возникают сложности во взаимодействии с системой. В общем, я сочинил вот этот вариант с вызовом, подобным сопрограмме и стало все просто. Спокойно разбираю входной поток, как будто это простая линейная программа, когда надо, вызываю программу выхода, не заботясь о том, что где-то работают какие-то другие программы, где-то есть какие-то прерывания и пр.
1036 - это уже ряд-3 или IBM/380. Она выпускалась с 1983 по 1989 год. Ряд-2 или IBM/370 начался с ЕС1035, выпускавшейся с 1977 по 1986. Вы же указали 1983-86 годы, когда ряд-1 уже почил в бозе. Я же в 1984 уже 1046 осваивал.
Во-первых, я указал 83-85. И при этом погорячился, надо было указать 83-84. Поскольку (вспомнил точнее) в первой половине 84-го я уже переключился на Электронику-60 (PDP-11/рус.) и за ЕС-ками больше не следил. Во-вторых, мало ли что-то где-то выпускалось? Я рассказал реальное положение, которое было в нашей глубинке в 84-м.
VladislavS писал(а):По размеру на несколько команд больше (в прошивку линкер сами функции не добавит, компилятор их заинлайнил), а по скорости выполнения, которая зачастую важнее, я бы даже поспорил.
Ага, больше всего в полтора раза.

11 команд против 16. Я не считаю первую команду у себя - это подсчет байтовой контрольной суммы, и у тебя - моя программа получает байт сразу в R4, а ты его еще добываешь откуда-то.
И, конечно, задачка фиговая, компилятор в процессе оптимизации, фактически, повторил дважды (почти) одни и те же действия. Будь этих действий не пара, а, хотя бы, десятка два, и пришел бы литовский праздник Обломайтис.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)