Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Data segment
- time dw 18 ;переменная таймера 18,2 сигнал в секунду (5 секунд - это 91 прерывание)
- txt db " ", 13,10,"$"
- mas db 1,2,4,5,3,8,1,4,16,3
- sum db 0
- Pos dw offset mas
- cnt dw 10 ;для счетчика смещения
- trii dw 1
- SAVE_CS DW 0 ;сохраняем сегмент заменяемого прерывания
- SAVE_IP DW 0 ;сохраняем смещение прерывания
- Data ends
- code segment
- start: assume cs:code, ds: data
- mov AX, data
- mov DS, AX
- ;сохраняем вектор - сохраняем исходные прерывания
- mov AH, 25h ;функция получения вектора
- mov AL, 8h ;номер вектора
- int 21h ;
- mov SAVE_IP, BX ;запоминаем смещение в BX
- mov SAVE_CS, ES ;запоминаем сегмент в ES
- push DS
- mov DX,offset rout
- mov AX, seg rout
- mov DS, AX
- mov AH, 25h ;в AH-> функцию установки вектора
- mov AL, 8h ;в AL-> номер вектора
- int 21h ;т.е. поменяли прерывание
- pop DS
- B:
- jmp B
- rout proc far
- push AX ;сохраняем все измененные регистры
- push DX
- dec time
- cmp time, 0
- jnz nxt
- cmp cnt, 0
- jz codeend
- dec cnt
- mov AX, 1
- mov time, AX
- mov cx, 10 ; количество элементов в массиве
- xor ax, ax
- xor si,si
- cycl: cmp mas[si], 10h ; сравнение элемента массива с 10h
- jne m1 ; если не равно, то переход в m1
- inc al ; если равно, то аl + 1, al - счетчик
- m1: inc si ; переход к след.эл
- loop cycl
- cmp al, 0 ; если аl = 0, то 10h ни разу не встретилось
- jz codeend ; выход при al = 0
- lea bx, mas ;берём в bx адрес первого элемента
- mov cx, trii ;счетчик цикла
- xor ax, ax
- cikl: add al, [bx] ;прибавляем к al байт, адрес которого хранится в bx
- inc bx ;переходим к следующему элементу
- loop cikl
- inc trii
- jc codeend
- call PrintNumber ;вызов процедуры вывода на экран числа из AX
- mov AH, 9h
- lea DX, txt
- int 21h
- nxt:
- pop DX
- pop AX ;восстановили регистры
- mov AL, 20h ;аппаратное прерывание
- out 20h, AL ;
- iret
- rout endp
- PrintNumber proc ;процедура показа числа из AX
- push BX
- push DX
- push SI
- push CX
- mov CX, 0
- mov BX, 10 ;в BX заносим основание системы счисления
- loophere: ;основной цикл
- mov DX, 0 ;обнуляем DX
- div BX ;делим на 10
- push AX ;результат в стеке
- add DL, "0" ;конвертируем последнюю цифру в ASCII-код
- pop AX ;вернем AX
- push DX ;сохраним DX
- inc CX ;увеличим CX на 1
- cmp AX, 0 ;повторяем для всех цифр числа
- jnz loophere
- mov AH, 2 ;DOS-функция вывода символа
- loophere2:
- pop DX ;восстанавливаем цифры от последней к первой и
- mov AH, 02h ;выводим их на экран
- int 21h
- loop loophere2
- pop CX
- pop SI
- pop DX
- pop BX
- ret
- PrintNumber endp
- codeend:
- CLI
- push DS
- mov DX, SAVE_IP
- mov AX, SAVE_CS
- MOV AL, 20h
- OUT 20h, AL
- mov DS, AX
- mov AH, 25h
- mov AL, 1ch
- int 21h
- pop DS
- STI
- mov AX, 4c00h
- int 21h
- code ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement