Advertisement
Wizard7002

Untitled

Dec 13th, 2022
1,224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Data segment
  2.     time dw 18          ;переменная таймера 18,2 сигнал в секунду (5 секунд - это 91 прерывание)
  3.     txt  db " ", 13,10,"$"
  4.     mas db 1,2,4,5,3,8,1,4,16,3
  5.     sum db 0   
  6.     Pos dw offset mas
  7.     cnt  dw 10          ;для счетчика смещения
  8.     trii dw 1
  9.     SAVE_CS DW 0            ;сохраняем сегмент заменяемого прерывания
  10.     SAVE_IP DW 0            ;сохраняем смещение прерывания
  11. Data ends
  12.  
  13. code segment
  14. start: assume cs:code, ds: data
  15.     mov AX, data
  16.     mov DS, AX
  17.    
  18. ;сохраняем вектор - сохраняем исходные прерывания
  19.     mov AH, 25h         ;функция получения вектора
  20.     mov AL, 8h          ;номер вектора
  21.     int 21h             ;
  22.     mov SAVE_IP, BX         ;запоминаем смещение в BX
  23.     mov SAVE_CS, ES         ;запоминаем сегмент в ES
  24.     push DS
  25.     mov DX,offset rout      
  26.     mov AX, seg rout        
  27.     mov DS, AX
  28.     mov AH, 25h         ;в AH-> функцию установки вектора
  29.     mov AL, 8h          ;в AL-> номер вектора
  30.     int 21h             ;т.е. поменяли прерывание
  31.     pop DS
  32. B:
  33. jmp B
  34.  
  35. rout proc far
  36.     push AX             ;сохраняем все измененные регистры
  37.     push DX
  38.     dec time
  39.     cmp time, 0
  40.     jnz nxt
  41.     cmp cnt, 0
  42.     jz codeend
  43.         dec cnt
  44.         mov AX, 1
  45.         mov time, AX
  46.    
  47.  
  48.  
  49.     mov cx, 10 ; количество элементов в массиве
  50.     xor ax, ax
  51.     xor si,si
  52.     cycl:   cmp mas[si], 10h ; сравнение элемента массива с 10h
  53.         jne    m1        ; если не равно, то переход в m1
  54.         inc    al    ; если равно, то аl + 1, al - счетчик
  55.     m1: inc si               ; переход к след.эл
  56.             loop cycl
  57.    
  58.     cmp al, 0                ; если аl = 0, то 10h ни разу не встретилось
  59.     jz codeend                 ; выход при al = 0
  60.  
  61.     lea bx, mas          ;берём в bx адрес первого элемента
  62.     mov cx, trii             ;счетчик цикла
  63.     xor ax, ax
  64.     cikl:   add al, [bx]     ;прибавляем к al байт, адрес которого хранится в bx
  65.         inc bx           ;переходим к следующему элементу
  66.         loop cikl
  67.     inc trii
  68.    
  69.     jc codeend
  70.         call PrintNumber    ;вызов процедуры вывода на экран числа из AX
  71.         mov AH, 9h
  72.         lea DX, txt    
  73.         int 21h
  74.    
  75.    
  76.  
  77.     nxt:
  78.     pop DX
  79.     pop AX              ;восстановили регистры
  80.     mov AL, 20h         ;аппаратное прерывание
  81.     out 20h, AL         ;
  82.     iret
  83. rout endp
  84.    
  85. PrintNumber proc            ;процедура показа числа из AX
  86.     push BX            
  87.     push DX
  88.     push SI
  89.     push CX
  90.     mov CX, 0          
  91.     mov BX, 10          ;в BX заносим основание системы счисления
  92. loophere:               ;основной цикл
  93.     mov DX, 0           ;обнуляем DX
  94.     div BX              ;делим на 10
  95.    
  96.     push AX             ;результат в стеке
  97.     add DL, "0"         ;конвертируем последнюю цифру в ASCII-код
  98.  
  99.     pop AX              ;вернем AX
  100.     push DX             ;сохраним DX
  101.     inc CX              ;увеличим CX на 1
  102.     cmp AX, 0           ;повторяем для всех цифр числа
  103. jnz loophere
  104.     mov AH, 2           ;DOS-функция вывода символа
  105. loophere2:
  106.     pop DX              ;восстанавливаем цифры от последней к первой и
  107.     mov AH, 02h         ;выводим их на экран
  108.     int 21h
  109. loop loophere2
  110.     pop CX
  111.     pop SI
  112.     pop DX
  113.     pop BX
  114.     ret
  115. PrintNumber endp            
  116.  
  117.  
  118. codeend:                
  119.     CLI
  120.     push DS
  121.     mov DX, SAVE_IP
  122.     mov AX, SAVE_CS
  123.    
  124.     MOV AL, 20h
  125.     OUT 20h, AL
  126.  
  127.     mov DS, AX
  128.     mov AH, 25h
  129.     mov AL, 1ch
  130.     int 21h
  131.     pop DS
  132.     STI
  133.     mov AX, 4c00h
  134.     int 21h
  135. code ends
  136.  
  137. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement