Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2015, 17:43   #1
V_I_P
Пользователь
 
Регистрация: 13.10.2013
Сообщений: 19
По умолчанию Составить программу «будильник»

Составить программу «будильник», выдающую на экран строку «Время истекло!» после запуска по истечении некоторого промежутка времени ( в секундах). Время задержки задается в командной строке. Используйте прерывание 08H или 1CH и 10H.
V_I_P вне форума Ответить с цитированием
Старый 19.04.2015, 12:46   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

1. Вводим два символа
2. Переводим ASCII в BCD (выводим/сохраняем)
3. Читаем из CMOS текущую BCD-секунду (выводим/сохраняем)
4. Складываем эти/два числа
5. Если результат больше/равно 60, отнимаем от результата 60
6. Читаем в цикле текущую секунду из CMOS
7. Если текущая секунда = результату, то "End of time" с бипером.

Flat Assembler 1.67.26
[timer.com | 262 байт]

Пример окна:
Enter timer value...: 25
Real time second...: 31
------------------------|
Please wait....
END of TIME.............|

Код:
use16
org 100h
jmp start

entrSec  db 13,10,' Enter timer value...: $'
realSec  db 13,10,' Real  time second...: $'
plsWait  db 13,10,' ------------------------|'
         db 13,10,' Please wait...$'
endTime  db 13,10,' END of TIME.............|$'

start:
    mov  dx,entrSec       ; запрос на установку таймера(сек)
    call message          ; юзер вводит 25..
    mov  cx,2             ; ограничим ввод двумя символами
userInp:
    xor  ax,ax
    int  16h              ; ждём символы,
    int  29h              ; и печатаем их.
    stosb                 ; сохраняем строку. ES:DI = 3235
loop userInp

;-------- переведём ASCII в BCD -----------------------------------------|
    xor  di,di            ; откуда копировать (начало строки)
    mov  ax,word[di]      ; копируем слово с DI в AX          (AX=3235)
    mov  cl,4             ; фактор сдвига (тетрада)
    shl  al,cl            ; сдвигаем влево младший байт       (AX=3250)
    shl  ax,cl            ; сдвигаем весь регистр             (AX=2500)
    mov  byte[di],ah      ; перезапишем DI значением AH       (DI=25)

;-------- выводим текущую секунду из CMOS -------------------------------|
    mov  dx,realSec
    call message          ; мессага юзеру

    mov  al,0Bh           ; настроим формат для чтения CMOS
    out  70h,al           ; выбираем регистр (порт:70h, регистр:0Bh)
    in   al,71h           ; читаем из него байт данных
    and  al,11111011b     ; сбрасываем в нём бит 2 (BCD-формат)
    out  71h,al           ; записываем обновлённый регистр обратно(Save)

    mov  al,0             ; CMOS 00h - секунда
    out  70h,al           ; послать в индексный порт CMOS
    in   al,71h           ; получили BCD-секунду (например: 59)
    push ax               ; сохраним её в стеке для сложения   (AX=0059)
    push ax               ; сохраним для вывода на экран
    shr  al,4             ; выделим старшие 4 бита             (AX=0005)
    add  al,30h           ; добавим тройку спереди             (AX=0035)
    int  29h              ; выводим '5' на экран
    pop  ax               ; снимаем со стека BCD-секунду       (AX=0059)
    and  al,0Fh           ; выделим младшие 4 бита             (AX=0009)
    add  al,30h           ; добавим тройку спереди             (AX=0039)
    int  29h              ; выводим '9' на экран

;-------- вычисляем время задержки (BCD-арифметика) ---------------------|
    clc                   ; обнулим флаг переноса
    pop  ax               ; снимаем со-стека текущую секунду   (AX=0059)
    mov  bl,byte[di]      ; в BL - наш ввод в BCD-формате      (BX=0025)
    adc  al,bl            ; складываем оба числа               (AX=007E)
    daa                   ; десятичная коррекция               (AX=0084)
    cmp  al,60            ; результат больше минуты?
    jle  intNum           ; если меньше/равно - пропускаем число
    sub  al,60            ; если больше - вычитаем от него 60  (AX=0024)
intNum:
    xor  cx,cx
    mov  cl,al            ; запомним число

;-------- читаем в цикле CMOS -------------------------------------------|
    mov  dx,plsWait
    call message          ; от сюда - пошёл отсчёт времени...

tLoop:
    mov  al,0         
    out  70h,al        
    in   al,71h           ; получили BCD-секунду
    cmp  cl,al           
    jnb  ends             ; переход, если равно
    jmp  tLoop

;---------конец программы-------------------------------------------------|
ends:
    mov  dx,endTime       ; выводим сообщение "End of time!"
    call message
    mov ah,2              ; звуковой сигнал бипером
    mov dl,7
    int 21h
    xor  ax,ax            ; по клавише - на выход
    int  16h
    int  20h

;---------различные функции-----------------------------------------------|
message:  ;---------------; функция вывода сообщений
   mov  ah,9
   int  21h
ret
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 19.04.2015 в 12:49.
R71MT вне форума Ответить с цитированием
Старый 19.04.2015, 22:50   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

...специально выложил кривой код, чтоб студенты шевелились - пока тихо
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 20.04.2015, 13:07   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
...специально выложил кривой код, чтоб студенты шевелились - пока тихо
R71MT,
не дождетесь, уже сдали и забыли, видали студенты этот ассемблер в гробу в белых тапках...
Mikl___ вне форума Ответить с цитированием
Старый 20.04.2015, 17:54   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..Mikl_..мне по-барабану!!!! Я сам учусь....
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 22.04.2015, 05:01   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

R71MT,
занятно,
Цитата:
Я сам учусь....
поэтому
Цитата:
...специально выложил кривой код
Mikl___ вне форума Ответить с цитированием
Старый 03.05.2015, 09:14   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Сегодня полистал справочник и нашёл более/простой вариант...
Оказывается, вовсе необязательно возиться со-CMOS и переводить в BCD, а есть специальные функции для работы с RTC (RealTimeClock).
Функции BIOS 04h и 02h позволяют считать дату/время в формате BCD:

INT 1Ah — Определить дату RTC (AH=04h)
Код:
    Ввод: АН = 04h 
   Вывод: СХ = год
          DH = месяц
          DL = день

C:\>debug
-a
0B18:0100 mov ah,4
0B18:0102 int 1Ah
0B18:0104
-t
AX=0000  BX=0000  CX=2015  DX=0503
INT 1Ah — Определить время RTC (AH=02h)
Код:
    Ввод: АН = 02h 
   Вывод: СН = час
          CL = минута
          DH = секунда
          DL = 01h, если действует летнее время, 00h, если нет

C:\>debug
-a
0B18:0100 mov ah,2
0B18:0102 int 1Ah
0B18:0104
-t
AX=0000  BX=0000  CX=1051  DX=0900
Кроме того, BIOS позволяет использовать RTC для организации будильников и задержек:

INT 1Ah — Установить будильник (AH=06h)
Код:
    Ввод: АН = 06h
          СН = час (BCD)
          CL = минута (BCD)
          DH = секунда (BCD) 
   Вывод: CF = 1, если произошла ошибка; CF = 0, если будильник установлен
Теперь каждые 24 часа, когда время совпадет с заданным, часы реального времени вызовут прерывание IRQ8 (INT 4Ah), которое должна обрабатывать установившая будильник программа.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу для Паскаль 9 класс: составить программу которая печатает таблицу умножения и сложения натуральных чисел goodula Помощь студентам 0 23.01.2014 17:39
Составить программу вычисления и печати таблицы значений функции при заданных значениях параметров Составить программу вычисле Марина1986 C/C++ Сетевое программирование 1 08.05.2013 13:34
никак не могу составить программы на паскале... кто нибудь помогииите составить программу program_1 Паскаль, Turbo Pascal, PascalABC.NET 1 04.12.2012 19:52
Составить программу на С++ Lonely_Dragon Помощь студентам 2 21.11.2011 13:31
Оцените мою программу: Будильник для компа Cj_ Софт 8 29.12.2009 15:57