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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2009, 12:48   #1
Петруха
 
Регистрация: 20.03.2009
Сообщений: 6
По умолчанию Создание резидентной программы (обработчик прерывания).

Здравствуйте! Кто может помогите пожалуйста. очень надо!!!


Задание:
На языке ассемблер написать резидентную программу, которая бы обрабатывала прерывание по времени (timer) и при одном проходе выводила бы на экран символ «*» , а на следующем проходе «!».

Текст программы создается в любом текстовом редакторе. Программа должна быть «COM»


Буду очень презнателен!!
Петруха вне форума Ответить с цитированием
Старый 20.03.2009, 13:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сам то как думаеш делать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.03.2009, 13:37   #3
Петруха
 
Регистрация: 20.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Сам то как думаеш делать?
может быть так?
тока как резидентную часть впихнуть и вывод символов после прохода???
Код:
code segment

assume CS:code,DS:data

;Главная процедура

main proc

mov AX,data   ; Инициализация сегментного 

mov DS,AX     ; регистра DS

;Сохраним исходный вектор

mov AH,35h    ; Функция получения вектора

mov AL,08h    ; Номер вектора

int 21h

mov word ptr old_08,BX ; Смещение исходного обработчика

mov word ptr old_08+2,ES ; Сегмент исходного обработчика

;Установим наш обработчик

mov AH,25h    ;Функция заполнения вектора

mov AL,08h    ; Номер вектора

mov DX,offset new_08 ; Смещение нашего обработчика

push DS                    ; Сохраним DS=data

push CS                    ; Перепишем CS в DS

pop DS                      ; через стек. DS:DX->new_08

int 21h

pop DS                         ; Восстановим DS=data

...                                   ; Продолжение основной программы

; Перед завершением программы восстановим исходный вектор

Ids DX ,old_08      ; Заполним DS:DX из old_08

mov AH,25h                     ; Функция заполнения вектора

move AL,08h           ; Номер вектора

int 21h

mov AX,4C00h         ;Функция завершения программы

int 21h

main endp

;Процедура обработчика прерываний от таймера

new_08 proc

...                ; Действия. выполняемые 18 раз в секунду

mov AL,20h     ;Разблокировка прерываний

out 20h,AL      ; в контроллере прерываний

iret                   ; Возврат в прерванную програму

new_08   endp

code ends

data segment

old_08 db 0   ; Ячейка для хранения исходного вектора

data ends

stk segment stack

db 256 dup(U)

stk ends

 end main

Последний раз редактировалось rpy3uH; 20.03.2009 в 15:19.
Петруха вне форума Ответить с цитированием
Старый 20.03.2009, 13:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

НАсчет того как резидента оставить - есть в БИОСе или ДОСе преравыние помоему под номером 27H которое завершает приложение но оставляет его в памяти... Попрой в этом направлении. Достань описания прерываний и посмотри там.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2009, 22:00   #5
Петруха
 
Регистрация: 20.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
НАсчет того как резидента оставить - есть в БИОСе или ДОСе преравыние помоему под номером 27H которое завершает приложение но оставляет его в памяти... Попрой в этом направлении. Достань описания прерываний и посмотри там.
Блин все пробывал .... программа работает не так как надо!!! она на одном проходе выдает звездочку и виснет!!! помогите с кодом пожалуйста!!!!! очень прошу!!!!

Цитата:
Сообщение от Петруха Посмотреть сообщение
может быть так?
тока как резидентную часть впихнуть и вывод символов после прохода???
Код:
code segment

assume CS:code,DS:data

;Главная процедура

main proc

mov AX,data   ; Инициализация сегментного 

mov DS,AX     ; регистра DS

;Сохраним исходный вектор

mov AH,35h    ; Функция получения вектора

mov AL,08h    ; Номер вектора

int 21h

mov word ptr old_08,BX ; Смещение исходного обработчика

mov word ptr old_08+2,ES ; Сегмент исходного обработчика

;Установим наш обработчик

mov AH,25h    ;Функция заполнения вектора

mov AL,08h    ; Номер вектора

mov DX,offset new_08 ; Смещение нашего обработчика

push DS                    ; Сохраним DS=data

push CS                    ; Перепишем CS в DS

pop DS                      ; через стек. DS:DX->new_08

int 21h

pop DS                         ; Восстановим DS=data

...                                   ; Продолжение основной программы

; Перед завершением программы восстановим исходный вектор

Ids DX ,old_08      ; Заполним DS:DX из old_08

mov AH,25h                     ; Функция заполнения вектора

move AL,08h           ; Номер вектора

int 21h

mov AX,4C00h         ;Функция завершения программы

int 21h

main endp

;Процедура обработчика прерываний от таймера

new_08 proc

...                ; Действия. выполняемые 18 раз в секунду

mov AL,20h     ;Разблокировка прерываний

out 20h,AL      ; в контроллере прерываний

iret                   ; Возврат в прерванную програму

new_08   endp

code ends

data segment

old_08 db 0   ; Ячейка для хранения исходного вектора

data ends

stk segment stack

db 256 dup(U)

stk ends

 end main
вставлял все что положено и прерывания пробывал!!!! виснет

Последний раз редактировалось rpy3uH; 22.03.2009 в 19:32.
Петруха вне форума Ответить с цитированием
Старый 23.03.2009, 10:36   #6
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

нужно бы весь код посмотреть что-бы, что-то подсказать
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 23.03.2009, 16:31   #7
Петруха
 
Регистрация: 20.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от airyashov Посмотреть сообщение
нужно бы весь код посмотреть что-бы, что-то подсказать

вот код после некоторой доработки.... не судите строго, недавно прогаю в асемблере


Код:
;**************Обработчик прерываний от таймера*************

code segment

assume CS:code,DS:data

;Главная процедура

main proc

mov AX,data   ; Инициализация сегментного 

mov DS,AX     ; регистра DS

;Сохраним исходный вектор

mov AH, 035h    ; Функция получения вектора

mov AL,08h    ; Номер вектора


mov word ptr old_08,BX ; Смещение исходного обработчика

mov word ptr old_08+2,ES ; Сегмент исходного обработчика

;Установим наш обработчик

mov AH,25h    ;Функция заполнения вектора

mov AL,08h    ; Номер вектора

mov DX,offset new_08 ; Смещение нашего обработчика

push DS   ; Сохраним DS=data

push CS  ; Перепишем CS в DS

pop DS     ; через стек. DS:DX->new_08



pop DS ; Восстановим DS=data

mov AH,01h
; Перед завершением программы восстановим исходный вектор

mov DX , NEW_08   ; Заполним DS:DX из old_08

mov AH,25h   ; Функция заполнения вектора

mov AL,08h         ; Номер вектора

mov AX,4C00h         ;Функция завершения программы

main endp

;Процедура обработчика прерываний от таймера

new_08 proc  ; Обработчик прерываний 

push AX      ;Сохраним исходное значение AX

MOV     AX, 0B800h
MOV     DS, AX
; Функция вывода символа
mov AL,'*'     ; Выводимый символ; Действия. выполняемые 18 раз в секунду
mov [56h], AL

int 10h            ; Переход в BIOS

mov AL,20h    ; Разблокировка прерываний

out 20h,AL      ; в контроллере прерываний

pop AX           ; Восстановим AX

iret                   ; Возврат в прерванную программу

new_08  endp              

mov AL,20h     ;Разблокировка прерываний

out 20h,AL      ; в контроллере прерываний

iret                   ; Возврат в прерванную програму



code ends

data segment

old_08 db 0   ; Ячейка для хранения исходного вектора

data ends

stk segment stack



stk ends

 end main

Последний раз редактировалось rpy3uH; 23.03.2009 в 20:31.
Петруха вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик вектора прерывания Festovec Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 07.04.2010 10:05
Создание несложной программы MadBull Фриланс 2 18.02.2009 02:54
Создание программы в С++ Panterka Помощь студентам 10 25.12.2007 13:12
Создание резидентной программы DenisVR Свободное общение 2 07.11.2007 19:42
создание программы помогите Farmaceft Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 20.04.2007 10:40