На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Таймер
    Кто может подсказать, как перехватывать прерывания от таймера? Мне нужно написать резидентную программу на Assemblere, которая через 1 минуту после запуска выводила какое-нибудь сообщение на экран. Может у кого-нибудь есть похожая прграмма?
      Что-то в таком духе:

      Цитата

      .286

      LOCALS

      .MODEL      TINY


      .CODE

      ORG      100h

      Start:
                 jmp      Init


      bDone            DB      0
      wCounter            DW      1092            ;начальное значение счетчика времени

      szMessage      DB      "Hello World!",0


      ;*******************************************************************************
      ;CharAddr3      определяет адрес символа в видеобуфере в текстовом режиме
      ;*******************************************************************************
      ;Вызов:            DL = столбец (x)
      ;            DH = строка (y)
      ;
      ;Возврат:      ES = сегмент видеобуфера
      ;            DI = смещение в видеобуфере
      ;
      ;Изменяемые
      ;  регистры:      DI,AX,Flags
      ;*******************************************************************************
      CharAddr3      PROC

                 mov      ax,40h
                 mov      es,ax            ;ES = сегмент области данных видео-BIOS
                 mov      al,dl
                 mov      di,ax            ;DI=x
                 mov      al,es:[4Ah]      ;AL = число символов в строке (COLS)
                 mul      dh            ;AX=y*COLS
                 add      di,ax            ;DI=x+y*COLS
                 shl      di,1            ;DI=2*(x+y*COLS)
                 mov      ax,0B800h
                 mov      es,ax            ;ES:DI -> видеобуфер

                 ret

      CharAddr3      ENDP

      ;*******************************************************************************
      ;WriteStr3      выводит строку символов с атрибутами в текстовом режиме
      ;*******************************************************************************
      ;Использует:      CharAddr3
      ;
      ;Вызов:            DS:SI -> ASCIIZ-строка
      ;            BL = атрибут символов строки
      ;            DL = координата x
      ;            DH = координата y
      ;
      ;Возврат:      нет
      ;
      ;Изменяемые
      ;  регистры:      AX,Flags
      ;*******************************************************************************
      WriteStr3      PROC

                 push      es
                 push      si
                 push      di

                 call      CharAddr3      ;ES:DI -> видеобуфер

                 mov      ah,bl            ;AH = атрибут символов строки

                 cld

      @@WriteLoop:      lodsb                  ;AL = текущий символ строки
                 or      al,al            ;конец строки?
                 jz      @@Exit
                 stosw
                 jmp      @@WriteLoop

      @@Exit:            pop      di
                 pop      si
                 pop      es

                 ret

      WriteStr3      ENDP


      Int8Handler      PROC      FAR

      ;Запуск старого обработчика прерывания
                 pushf
                 DB      09Ah            ;call XXXX:XXXX
      fpOldInt8      DD      ?

                 cmp      cs:[bDone],0
                 jne      @@Exit

                 dec      cs:[wCounter]
                 jnz      @@Exit

                 inc      cs:[bDone]

                 sti

                 push      ds
                 pusha

                 mov      al,20h            ;завершение прерывания
                 out      20h,al

      ;Вывод строки
                 push      cs
                 pop      ds
                 mov      si,OFFSET szMessage
                 mov      bl,4Ah
                 mov      dx,0C23h
                 call      WriteStr3
                 
                 popa
                 pop      ds

      @@Exit:            iret

      Int8Handler      ENDP


      Init:

      ;Сохранение старого обработчика и установка нового
                 xor      ax,ax
                 mov      es,ax

                 cli
                 mov      ax,OFFSET Int8Handler
                 xchg      ax,es:[8*4]
                 mov      WORD PTR [fpOldInt8],ax
                 mov      ax,cs
                 xchg      ax,es:[8*4+2]
                 mov      WORD PTR [fpOldInt8+2],ax
                 sti

      ;Освобождение сегмента среды
                 mov      es,ds:[2Ch]
                 mov      ah,49h
                 int      21h

      ;Завершение программы и сохранение ее резидентной
                 mov      dx,OFFSET Init
                 int      27h


      END            Start


      Сообщение отредактировано: rivitna -
        Опоздал :(
        Хотел первый ответить. Правда у меня хуже получилось.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0198 ]   [ 15 queries used ]   [ Generated: 27.04.24, 06:54 GMT ]