Задрежка на системном таймере

Тема в разделе "WASM.BEGINNERS", создана пользователем Exorcist, 21 апр 2008.

  1. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    Сделал программу задержку на 10 секунд на зацикливании. Преподователь сказал сделать задержку на системом таймере.
    Неделю мучаюсь.МОжете помочь?
    Цель:
    Выввести вермя на экран. ТИпо 12:30:35
    ПРоходит 10 секунд и программа прерываеться.Причем Чтобы использовался системный таймер.
    Заранее спасибо
     
  2. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    может я и гоню, но!

    Sleep(10*1000); // задержка на 10 секунд.
    вызывается и происходит задержка в kernel32.dll то бишь в системном таймере.......

    хотя конечно лезут мысли с GetTickCount... GetCurrentTime... Now()... Time()...
     
  3. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    А я думал использовать. Точнее наверно и надо использваоть
    Функцию 2ch 21 прерывания...
    МОжно листинг программы? задуманного на Sleep?
    НО вот пот 2ch 21 int было бы лучше>тока не могу реализовать еще и с выводом.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Exorcist
    Мне кажется, что лабораторные работы - этажом выше. Хотя бы написал на каком языке, в ДОС-окне,
    WIN-приложение ?

    Зад режка - я тащусь :)))
     
  5. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Спрашиваем у системы время, прибавляем к нему интервал ожидания, запоминаем. Далее в цикле узнаём время. Если больше или равно запомненому, выход из цикла. Аналогичным образом можно поступить с системным таймером - двойное слово по адресу 40:6c, инкрементируется каждые 55 мсек.
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Со Sleep тебе не пойдёт - тебя просять самому Sleep написать.
    А что такого сложного?
    Вызываеш int21h fn=2Ch -> CH-Hours, CL-Minutes, DH-Seconds, DL-сотые доли секунды.
    Запоминаеш StartTime=(Hours*60+Minutes)*60+Seconds;
    Потом в цикле делаеш int21_get_time(); CurrTime=(Hours*60+Minutes)*60+Seconds и если CurrTime-StartTime<10 продолжаеш цикл, иначе выход.
    А вообще проще через таймер сделать.
    Счётчик расположен по дресу 0040:006C - 32бита, изменяется 18.2 раза в секунду.
    Получаеш
    Код (Text):
    1.    push ds
    2.    xor  ax,ax
    3.    mov ds,ax
    4.    mov bx,46Ch
    5.    mov ecx,ds:[bx]
    6.    add  ecx,182
    7. @@sleep:
    8.    mov eax,ds:[bx]
    9.    sub  eax,ecx
    10.    jb    @@sleep
    11.    pop  ds
     
  7. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    TO Vovchik
    А можно программные наброски? И тот и тот вариант? А то уже 4ую лабу пишу голова пухнет)

    TO VAlterg :Com файл простой)
    ДА затупил в названии)
     
  8. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    To cppasm
    Хм.Идею понял.
    Как зациклить полностью?
    И как вывести значение времени на экран? Time:HH:MM:SS
     
  9. Exorcist

    Exorcist New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2008
    Сообщения:
    12
    2:cppasm
    Счётчик расположен по дресу 0040:006C - 32бита, изменяется 18.2 раза в секунду.
    Получаеться если счетчик изменился на 10 секунд то делаем выход из цикла?
    если разница значений начала и конца в 182 раза?
    Хм .
     
  10. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Вечером буду дома, напишу примеры процедур, т.к. сейчас на работе.
     
  11. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    invoke Sleep,100000
     
  12. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
  13. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Вы припарили уже своим Sleep() :)
    Что так трудно вопрос прочитать?
    Во-первых, под ДОС, а во-вторых - как ты себе это представляеш?
    Преподаватель: напишите задержку с использованием таймера
    Студент: нафик писать, всё написано до нас - Sleep(). а как работает мне пофиг.
    Так что ли?

    Счётчик изменился не в 182 раза, а на 182.
    Простейшая арифметика.
    1 секунда - 18.2 такта (изменение счётчика)
    10 секунд - X тактов (изменение счётчика)
    X=18.2*10/1=182
    На экран вывести легко. Преобразуй числа в строку и выведи например int21h fn=09