как сделаны writeln и readln

Тема в разделе "WASM.ASSEMBLER", создана пользователем Шубин, 31 окт 2006.

  1. Шубин

    Шубин New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    2
    Просветите неуча: как реализованы writeln и readln в Turbo Pascal и можно ли повторить это на ассемблере, например в Fasm? Интерес к этим функциям в том, что в них передается разное количество параметров:
    writeln(a,b), writeln(a,b,c) и readln, readln(e,d,f).
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    ну так проще тогда глянуть на сорец printf из C библиотеки.. кстати переменные параметры на сколько я знаю получаются благодаря стандарту вызова функций _cdecl
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Шубин
    Write[Ln]
    Read[Ln]
    По своей сущьности не являются функциями. Физичиски их не существует, есть только их заголовки в turbo.tpl. Компилятор сам каким то хитрым способом их состовляет.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Pavia
    Точно? А то вроде я когда дизасмил паскалевские проги встречал вызовы writeln как вызов функции.
    Шубин
    При вызове первым параметром указывай количество следующих за ним параметров.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    n0name
    Он имел ввиду исходный код.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Pavia
    Точно.
    Для каждего параметра компилятор вставляет функцию в код.
    Integer - Write0Long, для string - Write0String, и так далее.
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    n0name
    Точно, эти вызовы распадаються на вызовы функций, который вводят/выводят инты, флоаты и т.д. в зависимости от необходимости. У Касперски в фундаментальных основах про это упоминалось. Т.е. все эти readln writeln живут только до компиляции
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    1. Указывать явно количество параметров, переданых в ф-цию, как заметил n0name
    2. Передавать форматированную определенным образом строку, из которой ф-ция могла бы сама определить количество параметров и выделить сами параметры (как например printf)
    3. Передавать все время максимально допустимое кол-во параметров, часть которых будет optional (со значением например ноль, если параметр не нужно обрабатывать).
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    4. Ввести константу - флаг конца списка параметров. Например 0. Когда текущий параметр равен этой константе, тогда этот параметр последний.
     
  10. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Если сменить язык на С/С++, есть ещё два варианта

    5. Использовать жестокие макросы, которые на этапе прекомпиляции будут так или иначе выводить количество параметров и передавать в настоящую функцию. Сам такого не умею, но люди вроде делают.
    6. Написать десять функций с одним именем и разным количеством параметров. Опять же, они все будут реализованы через вызов внутренней настоящей функции. Вряд ли когда-нибудь понадобится более 10-ти параметров

    Можно ли повторить что-то из этого на ассемблере - не уверен.. Второе точно нельзя, а вот с макросами - х.з.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    sergh
    Отнюдь. У меня была мысль написать реализацию перегрузки функций по кол-ву параметров, но пока нет особой необходимости в этом. Но реализовать можно (на фасме, ессно).
     
  12. Шубин

    Шубин New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    2
    В принципе, я так и предполагал, что эти функции не существуют после компиляции, и что их обрабатывает сам компилятор. Думаю, проще всего реализовать Си-шный printf где количество параметров и их тип задается как строка.
     
  13. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    а почему бі просто не подключить msvcrt.dll и не использовать его?
     
  14. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    IceStudent
    Здорово! Как оказывается продвинулось ассемблеростроение :)