Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализовать вызов процедуры через системное прерывание  (Прочитано 13953 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mycodeurnghtmr
Новенький

ru
Offline Offline

« : 19-09-2015 23:03 » 

Доброго времени суток. Вот задание: Реализовать вызов процедуры через системное прерывание для создания нового массива из положительных чисел произвольного массива однобайтных чисел. Входные параметры: адрес исходного массива, его длина, адрес нового массива.
Вот код с процедурой. Но не понимаю теперь как правильно записать адрес собственной процедуры в вектор прерывания. :С Заранее огромное спасибо.
Код: (ASM)
.386
dseg segment use16
mass1 db 1,-20,30,40,-30,50,-40,100,-45,2
dseg ends
eseg segment use16
mass2 db 10 dup(?)
eseg ends
cseg segment use16
assume ds:dseg, cs:cseg, es:eseg
;загрузка регистров-указателей сегментов ds, es
code:  mov cx, dseg
       mov ds, cx
       mov cx, eseg
       mov es, cx
;входные параметры процедуры
lea si, ds:mass1
mov cx,10
lea di, es:mass2
call maspr
;завершение исполнения
mov ah, 4ch
int 21h
;объявление поцедуры
maspr proc
cycl: cmp byte ptr ds:[si], 0
jl m1
movsb
jmp m2
m1:inc si
m2:loop cycl
ret
maspr endp
cseg ends
end code
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-09-2015 09:45 » new

Не знаю о чем речь идет Улыбаюсь
Но...
Последовательно ответив на вопросы, вы найдете ответ, наверное.
Что такое вектор прерывания?
Где находится таблица векторов прерывания?
Что находится в таблице векторов прерывания?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
mycodeurnghtmr
Новенький

ru
Offline Offline

« Ответ #2 : 20-09-2015 14:35 » 

Ну, в общем, вот так вроде заработало. Может пригодится кому.
Код: (ASM)
.386
dseg segment use16
mass1 db 1,-20,30,40,-30,50,-40,100,-45,2
vect dd ?
dseg ends
eseg segment use16
mass2 db 10 dup(?)
eseg ends
cseg segment use16
assume ds:dseg, cs:cseg, es:eseg
;загрузка регистров-указателей сегмента ds
code:  mov cx, dseg
       mov ds, cx
       mov cx, eseg
       mov es, cx
;сохраним адрес обработчика прерываний
push es
mov ah,35h
mov al,69h
int 21h                
mov word ptr ds:vect,bx     ;Вначале младшее слово (смещение)
mov word ptr ds:vect+2,es ;Затем старшее (сегмент)
pop es
push ds
;изменение вектора
mov cx, cs
mov ds, cx
lea dx, cs:maspr
mov ah,25h
mov al,69h
int 21h
pop ds    
;входные параметры процедуры    
mov cx,10
lea si, ds:mass1
lea di, es:mass2
;вызовем резидентный обработчик прерывания
int 69h
;восстановим старый обработчик прерывания
mov dx,word ptr ds:vect
mov ds, word ptr ds:vect+2
mov ah, 25h
mov al,69h
int 21h
;завершение исполнения
mov ah, 4ch    
int 21h
;объявление поцедуры
maspr proc
cycl: cmp byte ptr ds:[si], 0
jl m1
movsb
jmp m2
m1:inc si
m2:loop cycl
iret    
maspr endp
cseg ends
end code
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 20-09-2015 20:28 » 

Что это за 21-ое прерывание?
Соответствует ли он аппаратному?

Почему именно 21-ое, а например не 33-е?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines