конвейеризация программ

Discussion in 'WASM.BEGINNERS' started by Administrator, Feb 24, 2010.

  1. Administrator

    Administrator New Member

    Blog Posts:
    0
    Знаете есть такая программа в MS-DOS называется more, вот я пишу что-то похожее, но только длоя перекодировки из Win в DOS. Но проблема в том, что я не знаю как останавливать вцыполнение таких программ. Вот пример:
    Code (Text):
    1.         .model  tiny
    2.         .code
    3.         org     100h
    4. main:
    5.         mov     ah, 08h
    6.         int     21h
    7.         mov     dl, al
    8.         dec     dl
    9.         mov     ah, 02h
    10.         int     21h
    11.         jmp     main
    12. end     main
    Я откомпилировал эту программу в файл N.COM
    Если я ввожу в командную строку команду echo bcd|n, то на экране появляется надпись abc♀ , что правильно, но программа не завершает работу (она же зацикленна). Вот вопрос как сделать что-бы программа, работающая в конвейерном режиме завершала работу после приема всех данных?
     
  2. n0name

    n0name New Member

    Blog Posts:
    0
    сравнивать полученный байт с EOF.
     
  3. Administrator

    Administrator New Member

    Blog Posts:
    0
    я вот только не понял а какой конкретно код имеет EOF? Пробывал сравнивать с 1A, но не выходит.
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Administrator
    поставте эксперимент
    запрашиваете у пользователя клавишу и выводите код (дополнительный тоже)
    нажмите ctrl+z - увидите какой код ну или в справочнике посмотрите
    только проблема в том что ставить в конце файла символ eof привычка не всех редакторов :dntknw:
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    еще вариант есть проверкой готовности ввода - как только ввода нет завершаете работу
     
  6. Administrator

    Administrator New Member

    Blog Posts:
    0
    код Ctrl+Z - 26 (т.е. как я и писал 1A) С ним ничего не вышло
     
  7. Administrator

    Administrator New Member

    Blog Posts:
    0
    Вот этот код:
    Code (Text):
    1.         .model  tiny
    2.         .code
    3.         org     100h
    4. main:
    5.         mov     ah, 08h
    6.         int     21h
    7.         cmp     al, 1ah
    8.         je      exit
    9.         mov     dl, al
    10.         dec     dl
    11.         mov     ah, 02h
    12.         int     21h
    13.         jmp     main
    14. exit:   mov     ax, 4c00h
    15.         int     21h
    16. end     main
    Он не работает. Если я ввожу команду echo hello|n или команду type 1.txt|n, то программа не завершается, хотя если ее просто запустить (без перенаправления входа), то при нажатии Ctrl+Z она завершает работу
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Administrator
    пробуйте 2 вариант
     
  9. Administrator

    Administrator New Member

    Blog Posts:
    0
    Какой 2 вариант?
     
  10. Administrator

    Administrator New Member

    Blog Posts:
    0
    "как только ввода нет завершаете работу" - да, но ведь программа more не завершает работу как только входа нет (попробуйте запустить ее без перенаправления входа командой more), значит можно сделать как-то иначе. Думаю что я попробую разобраться в программе more в TurboDebeger.
    А вот программа написанная на старом добром QuickBASIC:
    Code (Text):
    1. START:
    2. X$ = INKEY$
    3. IF X$ <> "" THEN PRINT ASC(X$);
    4. GOTO START
    Она выводит ASCII-коды нажатых клавиш. Я ее откомпилировал в ASCII.EXE и если ввожу команду echo hello|ascii, то не смотря на то, что программа зациклинна - она завершает работу по окончанию строки "hello",13,10
     
  11. valterg

    valterg Active Member

    Blog Posts:
    0
    Ну в ДОС-е, да и в Винде вроде есть понятие стандартные файлы ввода и вывода.
    Работайте с ними и не будет проблем с определением конца - это будет конец файла.
    Их даже по-моему открывать не надо - они открыты на номера 1 и 2.
     
  12. Administrator

    Administrator New Member

    Blog Posts:
    0
    Поясните, пожалуйсто
    Как его определить?

    Ничего не понял
     
  13. valterg

    valterg Active Member

    Blog Posts:
    0
    Учебник по ДОС откройте.
    Есть функция открытия/создания файла - она , если склероз не изменяет, возвращает его "номер".
    Далее есть функции чтения/записи из/в файл. В качестве кода ответа в т.ч. и "конец файла".
    Номера 1,2 и 3 зарезервированы и прицеплены к стандартному вводу(клавиатура), выводу(дисплей) и ввывод ошибок(тоже дисплей). Функции конвеера позволяют перенаправить и "сцепить" эти "файлы". Вы просто выбрали неправильный инструмент - в ДОС у 21-го прерывания много функций.
     
  14. Administrator

    Administrator New Member

    Blog Posts:
    0
    кажется я понял.
    Функция чтения с клавиатуры как из файла:
    Code (Text):
    1. mov ah, 3fh
    2. xor bx, bx
    3. mov cx, {длина}
    4. lea dx, {область ввода}
    5. int 21h
    Функция вывода на экран как в файл:
    Code (Text):
    1. mov ah, 40h
    2. mov bx, 01
    3. mov cx, {длина}
    4. lea dx, {облость вывода}
    5. int 21h
    Ты это имел ввиду?
     
  15. Administrator

    Administrator New Member

    Blog Posts:
    0
    Класс! Всё получилось! Спасибо!
     
  16. Administrator

    Administrator New Member

    Blog Posts:
    0
    valterg
    Какой посоветуете?
    Я изучаю ассемблер по книжке Абеля "программирование для IBM PC"