Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
Gnomsams
TASM

Переопределить прерывание таймера 8h, и каждые 5 секунд загонять в буфер клавиатуры букву 'а'

17.12.2011, 01:24. Показов 6176. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, помогите. Задали задачку на асме. Необходимо переопределить прерывание таймера 8h, и каждые 5 секунд загонять в буфер клавиатуры букву 'а'. Все, что я смогла написать ниже:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
.model tiny
.code
.startup
.386
    jmp main
    
    old_int8h_offset dw ?
    old_int8h_segment dw ?
    
    installed dw 8888
    install db 'Installed$'
    no_memory db 'Out of memory$'
    uninstall db 'Uninstalled$'
    cant_remove db 'Error: cannot uninstall program$'
 
new_int8h proc
    ;push ax
    pusha
    push es
    push ds
    push cs
    pop ds
    pushf
    
    mov ah, 2
    mov dl, 'а'
    int 21h
exit_int:
    mov al, 20h
    out 20h, al
    pop ds
    pop es
    popa
    ;pop ax
    iret
new_int8h endp  
    
main:
        mov ah, 35h                     ; получить в ES:BX адрес прерывания 8h
        mov al, 8h                                    
        int 21h
        cmp word ptr es:installed,8888 ; проверка того, загружена ли уже программа
        je remove                   ; если загружена - выгружаем
        
        push es
        mov ax, ds:[2Ch]                ; psp
        mov es, ax
        mov ah, 49h                     ; хватит памяти чтоб остаться
        int 21h                         ; резидентом?
        pop es
        jc not_mem                      ; не хватило - выходим
        mov cs:old_int8h_offset, bx     ; запомним старый адрес 08
        mov cs:old_int8h_segment, es    ; прерывания
        mov ah, 25h                     ; установим вектор на 08
        mov al, 8h
        mov dx, offset new_int8h        ; прерывание
        int 21h
        mov dx, offset install          ; выводим что все ок
        mov ah, 9
        int 21h
        mov dx, offset main             ; остаемся в памяти резидентом
        int 27h                         ; и выходим
        ; конец основной программы      
remove:                                 ; выгрузка программы из памяти
        push es
        push ds
        mov dx, es:old_int8h_offset     ; возвращаем вектор прерывания
        mov ds, es:old_int8h_segment    ; на место
        mov ah, 25h
        mov al, 8h
        int 21h
        pop ds
        pop es
        mov ah, 49h                     ; освобождаем память
        int 21h
        jc not_remove                   ; не освободилась - ошибка
        mov dx, offset uninstall        ; все хорошо
        mov ah, 9
        int 21h
        jmp exit                        ; выходим из программы
not_remove:                             ; ошибка с высвобождением памяти.
        mov dx, offset cant_remove                                             
        mov ah, 9
        int 21h
        jmp exit
not_mem:                                ; не хватает памяти, чтобы остаться резидентом
        mov dx, offset no_memory
        mov ah, 9
        int 21h
exit:                                   ; выход
        int 20h
end

Но эта программка моя вводит только один раз букву 'а' и все =\ Помогите, пожалуйста.
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2011, 01:24
Ответы с готовыми решениями:

Всплывающее окно через 30 секунд после загрузки страницы и затем каждые 30 секунд
Задача Нужно реализовать всплывающее окно через 30 секунд после загрузки страницы, показать его на 10 секунд и скрыть. Затем повторять...

Компьютер зависает на 0,1 секунд каждые 5 секунд
БП 350w silent power Описание лага: во время такого лага ЗВУК заедает (если звучал какойто сигнал он заедается), ВИДЕО на экране...

Изменение стиля текста в document.write через 10 секунд после загрузки сайта и изменяет цвет текста каждые 10 секунд
<style type="text/css"> .st1 { color: green; * * font: 20pt Arial; * * text-align: center; } </style> Код в body: ...

2
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
17.12.2011, 16:28
Лучший ответ Сообщение было отмечено как решение

Решение

Вобщем, резидента писать лень.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
               org  100h
start:         jmp  main
 
_int1C:         pushf
        inc byte ptr cs:flag
; *5 раскомментарьте, ждать было лень
        cmp byte ptr cs:flag,18;*5  ; got 5 sec. signal?
        jz  @@1         ; yes, processing
@@0:        popf
        jmp dword ptr cs:old_int1C      ; go back
@@1:        mov byte ptr cs:flag, 0
        push    ax
        push    cx
        mov ah, 05h
        mov cx, 'a'
        int 16h
        pop cx
        pop ax
        jmp     @@0
old_int1C:  dd  ?
flag:       db  0
 
main:
        push    cs
        push    cs
        pop ds
        pop es
                mov     ax, 351Ch                                     ; получить в ES:BX адрес прерывания 8h
            int     21h
            mov     word ptr cs:old_int1C, bx     ; запомним старый адрес 08
            mov     word ptr cs:old_int1C+2, es    ; прерывания
                mov     ax, 251Ch                                             ; установим вектор на 08
            mov     dx, _int1C        ; прерывание
            int     21h
; ввод строки. каждые ~5 сек. появляется буква "а"
            mov ah, 0Ah
        mov dx, inpbuf
        int 21h
 
remove: 
            mov dx, word ptr old_int1C     ; возвращаем вектор прерывания
            mov ds, word ptr old_int1C+2    ; на место
            mov ax, 251Ch
                int 21h
exit:                                   ; выход
            int 20h
inpbuf: db  255         ; наибольшая длина строки
len:    db  ?                       ; сюда вернется настоящая длина
buf:    db  255 dup(?)              ; тут будет то, что ввели
Int 1C - TIME - SYSTEM TIMER TICK
Desc: This interrupt is automatically called on each clock tick by the INT 08 handler
Notes: This is the preferred interrupt to chain when a program needs to be invoked regularly.
Ещё комменты нужны?
3
Gnomsams
17.12.2011, 17:43
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Вобщем, резидента писать лень.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
               org  100h
start:         jmp  main
 
_int1C:         pushf
        inc byte ptr cs:flag
; *5 раскомментарьте, ждать было лень
        cmp byte ptr cs:flag,18;*5  ; got 5 sec. signal?
        jz  @@1         ; yes, processing
@@0:        popf
        jmp dword ptr cs:old_int1C      ; go back
@@1:        mov byte ptr cs:flag, 0
        push    ax
        push    cx
        mov ah, 05h
        mov cx, 'a'
        int 16h
        pop cx
        pop ax
        jmp     @@0
old_int1C:  dd  ?
flag:       db  0
 
main:
        push    cs
        push    cs
        pop ds
        pop es
                mov     ax, 351Ch                                     ; получить в ES:BX адрес прерывания 8h
            int     21h
            mov     word ptr cs:old_int1C, bx     ; запомним старый адрес 08
            mov     word ptr cs:old_int1C+2, es    ; прерывания
                mov     ax, 251Ch                                             ; установим вектор на 08
            mov     dx, _int1C        ; прерывание
            int     21h
; ввод строки. каждые ~5 сек. появляется буква "а"
            mov ah, 0Ah
        mov dx, inpbuf
        int 21h
 
remove: 
            mov dx, word ptr old_int1C     ; возвращаем вектор прерывания
            mov ds, word ptr old_int1C+2    ; на место
            mov ax, 251Ch
                int 21h
exit:                                   ; выход
            int 20h
inpbuf: db  255         ; наибольшая длина строки
len:    db  ?                       ; сюда вернется настоящая длина
buf:    db  255 dup(?)              ; тут будет то, что ввели
Ещё комменты нужны?

Спасибо большое, разобралась :)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2011, 17:43
Помогаю со студенческими работами здесь

Прерывание таймера T1 в ATMega16
Доброго времени суток! Пишу программу для ATMega16 под VMLAB нужно обработать прерывание от таймера T1 (работает в режиме СТС) . Так вот...

Прерывание таймера TIM2
Начал потихоньку разбираться в STM32. Сконфигурировал прерывание таймера 2 с частотой 1Гц (1 секунда). RCC->APB1ENR |=...

Настройка таймера на шим и прерывание
Здравствуйте! Мне нужно настроить таймер на шим с прерыванием по спадающему фронту. Собираю проект в CooCox. Не могу найти в параметрах...

Прерывание по переполнению таймера на Ардуино
Не пойму это ардуина с прерываниями не работает или я туплю? #define led 5 void setup() { DDRB |= 1<<led; TCCR0B...

[Решено] Не срабатывает прерывание по захвату таймера А
Не срабатывает прерывание по захвату таймера А. Вот код, я уже вырезал все, оставил только инициализацию таймера и тупо включил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru