Просветите неуча: как реализованы writeln и readln в Turbo Pascal и можно ли повторить это на ассемблере, например в Fasm? Интерес к этим функциям в том, что в них передается разное количество параметров: writeln(a,b), writeln(a,b,c) и readln, readln(e,d,f).
ну так проще тогда глянуть на сорец printf из C библиотеки.. кстати переменные параметры на сколько я знаю получаются благодаря стандарту вызова функций _cdecl
Шубин Write[Ln] Read[Ln] По своей сущьности не являются функциями. Физичиски их не существует, есть только их заголовки в turbo.tpl. Компилятор сам каким то хитрым способом их состовляет.
Pavia Точно? А то вроде я когда дизасмил паскалевские проги встречал вызовы writeln как вызов функции. Шубин При вызове первым параметром указывай количество следующих за ним параметров.
Pavia Точно. Для каждего параметра компилятор вставляет функцию в код. Integer - Write0Long, для string - Write0String, и так далее.
n0name Точно, эти вызовы распадаються на вызовы функций, который вводят/выводят инты, флоаты и т.д. в зависимости от необходимости. У Касперски в фундаментальных основах про это упоминалось. Т.е. все эти readln writeln живут только до компиляции
1. Указывать явно количество параметров, переданых в ф-цию, как заметил n0name 2. Передавать форматированную определенным образом строку, из которой ф-ция могла бы сама определить количество параметров и выделить сами параметры (как например printf) 3. Передавать все время максимально допустимое кол-во параметров, часть которых будет optional (со значением например ноль, если параметр не нужно обрабатывать).
4. Ввести константу - флаг конца списка параметров. Например 0. Когда текущий параметр равен этой константе, тогда этот параметр последний.
Если сменить язык на С/С++, есть ещё два варианта 5. Использовать жестокие макросы, которые на этапе прекомпиляции будут так или иначе выводить количество параметров и передавать в настоящую функцию. Сам такого не умею, но люди вроде делают. 6. Написать десять функций с одним именем и разным количеством параметров. Опять же, они все будут реализованы через вызов внутренней настоящей функции. Вряд ли когда-нибудь понадобится более 10-ти параметров Можно ли повторить что-то из этого на ассемблере - не уверен.. Второе точно нельзя, а вот с макросами - х.з.
sergh Отнюдь. У меня была мысль написать реализацию перегрузки функций по кол-ву параметров, но пока нет особой необходимости в этом. Но реализовать можно (на фасме, ессно).
В принципе, я так и предполагал, что эти функции не существуют после компиляции, и что их обрабатывает сам компилятор. Думаю, проще всего реализовать Си-шный printf где количество параметров и их тип задается как строка.