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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2015, 17:19   #1
V-alterman
Пользователь
 
Регистрация: 07.12.2013
Сообщений: 26
По умолчанию Реализовать вызов процедуры через системное прерывание

Доброго времени суток. Вот задание: Реализовать вызов процедуры через системное прерывание для создания нового массива из положительных чисел произвольного массива однобайтных чисел. Входные параметры: адрес исходного массива, его длина, адрес нового массива.
Вот код с процедурой. Но не понимаю теперь как правильно записать адрес собственной процедуры в вектор прерывания. :С Заранее огромное спасибо.
Код:
.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
V-alterman вне форума Ответить с цитированием
Старый 30.09.2015, 18:35   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от V-alterman Посмотреть сообщение
Входные параметры: адрес исходного массива, его длина, адрес нового массива.
Код:
USE16
ORG 100h
JMP  start

mess1   DB   'Found positive element: $'
Array1  DB   1,-20,30,40,-30,50,-40,100,-45,2
aSize   =    $ - Array1           ; длинна массива
Array2  DB   10 DUP(0)            ; новый массив
old_99  DW   0,0                  ; сохранённый вектор-99

start:
   MOV   AH,9                     ; мессага юзеру
   MOV   DX,mess1
   INT   21h
;=================== СОХРАНЯЕМ ОРИГИНАЛЬНЫЙ ВЕКТОР 99 ===========================//
   PUSH  ES                       ; функция меняет ES. В стек его...
   MOV   AX,3599h
   INT   21h
   MOV   WORD[old_99],ES          ; сегмент,
   MOV   WORD[old_99+2],BX        ;    ..и смещение в переменной
   POP   ES
;=================== ПЕРЕХВАТЫВАЕМ ПРЕРЫВАНИЕ 99 ================================//
   PUSH  DS
   MOV   AX,2599h
   MOV   DX,new_99                ; DX = адрес нашей функции
   INT   21h
   POP   DS
;=================== ПЕРЕДАЁМ ПАРАМЕТРЫ НАШЕЙ ФУНКЦИИ ===========================//
   XOR   BX,BX                    ; счётчик найденных элементов
   MOV   CX,aSize                 ; длинна массива
   MOV   SI,Array1                ; источник..
   MOV   DI,Array2                ; приёмник..
   INT   99h                      ; вызов!
;=================== ВОССТАНАВЛИВАЕМ ВЕКТОР 99 ==================================//
   PUSH  DS                
   MOV   AX,2599h 
   MOV   DS,WORD[old_99]
   MOV   DX,WORD[old_99+2]
   INT   21h
   POP   DS
;=================== ВЫХОД! =====================================================//
   XOR   AX,AX                    ; по-клавише..
   INT   16h
   MOV   AH,4Ch                   ;     .. на выход!
   INT   21h

;================================================================================//
new_99:
   LODSB                          ; берём в AL байт из SI
   OR    AL,AL                    ; проверка флага SF на нуль
   JNS   found                    ; сброшен? Значит число положительное..
   LOOP  new_99                   ; если число отрицательное, то пропускаем его
found:
   STOSB                          ; запись в новый массив
   INC   BX                       ; увеличиваем счётчик найденных элементов
   LOOP  new_99                   ; мотаем цикл CX-раз

   XCHG  AL,BL                    ; выводим счётчик на экран
   OR    AL,30h                   ; переводим число в символ
   INT   29h
   IRET                           ; выход из прерывания
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++, прерывание процедуры (функции типа void) Alendorff Помощь студентам 5 05.01.2013 07:18
Прерывание процедуры carno Общие вопросы Delphi 28 01.11.2011 12:02
Полиморфизм. Как реализовать вызов метода? katbka Общие вопросы C/C++ 12 20.05.2010 22:02
Вызов процедуры Kashp Общие вопросы Delphi 4 31.03.2008 16:22
Вызов процедуры Илья Кибель Помощь студентам 7 17.09.2007 19:43