Advertisement
vikdema

Untitled

Mar 25th, 2021
2,005
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 6.18 KB | None | 0 0
  1. AStack SEGMENT STACK
  2.  DB 2048 DUP(?)
  3. AStack ENDS
  4.  
  5. DATA SEGMENT
  6.  
  7.  
  8. LOADACCEPT db 'loading is complete',0DH, 0AH,'$'
  9. DELETEMEMORY db 'Mem free',0DH, 0AH,'$'
  10. NEEDUNLOUD db 'The / un flag is set',0DH, 0AH,'$'
  11. ISLOAD db 'Interrupt already loaded',0DH, 0AH,'$'
  12. ISLOADBOOL dw 0000h
  13. FLAGBOOL dw 0000h
  14.  
  15.  
  16. DATA ENDS
  17.  
  18. CODE SEGMENT   
  19.  ASSUME CS:CODE, DS:DATA, SS:AStack
  20.  keep dd ?
  21.  
  22. ROUT PROC FAR
  23.     jmp start
  24.     PSP dw ?
  25.     Signature dw 00FFh
  26.     KEEP_CS DW 0 ; для хранения сегмента
  27.     KEEP_IP DW 0
  28.     SUM DW   0000h
  29.     COUNTTEXT db 'Count:','$'
  30.     start:
  31.    
  32.     push ax
  33.     push cx
  34.     push bx
  35.     push dx
  36.    
  37.     ;запоминаем курсор
  38.     ;----------------------------- 
  39.     mov ah,03h
  40.     mov bh,0
  41.     int 10h
  42.     push dx
  43.     ;----------------------------- 
  44.    
  45.     ;задаем новое положение
  46.     ;----------------------------- 
  47.     mov dh,10
  48.     mov dl,40
  49.     mov ah,02h
  50.     mov bh,0
  51.     int 10h
  52.     ;----------------------------- 
  53.  
  54.     ;выводим сообщение из памяти
  55.     ;----------------------------- 
  56.     mov ax,seg COUNTTEXT
  57.     mov es,ax
  58.     mov bp,offset COUNTTEXT
  59.     mov ah,13h
  60.     mov al,1
  61.     mov bl,1
  62.     mov bh,0
  63.     mov cx,6;длина строки
  64.     int 10h
  65.     ;----------------------------- 
  66.     mov ax,SUM
  67.     inc ax
  68.     mov SUM,ax
  69.     ;выводим число,переводя het to dec.
  70.     ;----------------------------- 
  71.     xor     cx, cx
  72.     xor dx,dx
  73.     mov     bx, 0ah ; основание сс. 10 для десятеричной и т.п.
  74. loop_to:
  75.    
  76.     div     bx
  77.     push    dx
  78.     inc     cx
  79.     xor     dx,dx
  80.     test    ax, ax
  81.     jne     loop_to
  82.    
  83. write:
  84.     pop     dx
  85.     add     dl, '0'
  86.     mov al,dl
  87.    
  88.     push cx
  89.     ;сдвиг
  90.     ;----------------------------- 
  91.     mov ah,03h
  92.     mov bh,0
  93.     int 10h
  94.     inc dl
  95.     mov ah,02h
  96.     mov bh,0
  97.     int 10h
  98.     ;----------------------------- 
  99.    
  100.    
  101.     ;вывод символа
  102.     mov ah,09h
  103.     mov bh,0
  104.     mov cx,1
  105.     int 10h
  106.     pop cx
  107.    
  108.     loop    write
  109.     ;----------------------------- 
  110.    
  111.     ;возвращаем старое положение курсора
  112.     ;----------------------------- 
  113.     pop dx
  114.    
  115.     mov ah,02h
  116.     mov bh,0
  117.     int 10h
  118.     ;----------------------------- 
  119.  
  120.    
  121.    
  122.    
  123.     pop dx
  124.     pop bx
  125.     pop cx
  126.     pop ax
  127.     mov al,20h
  128.     out 20h,al
  129.     iret
  130. ROUT ENDP
  131.  
  132.  
  133. PRINT PROC near
  134.     push ax
  135.     mov AH, 09h             ;Ќ®¬Ґа дг­ЄжЁЁ 09h
  136.     int 21h
  137.     pop ax
  138.     ret
  139. PRINT ENDP
  140.  
  141. CHECKINTERRUPTS proc near  
  142.     push ax
  143.     push bx
  144.     push es
  145.     mov ah,35h
  146.     mov al,1ch
  147.     int 21h
  148.     mov KEEP_IP,bx
  149.     mov KEEP_CS,es
  150.    
  151.     ;проверка по signature, которое содержится в памяти
  152.     ;-------------------------
  153.     mov ax,Signature
  154.     mov si, offset Signature
  155.     sub si, offset ROUT
  156.     cmp ax,es:[bx+si]
  157.     ;-------------------------
  158.     je writeThis
  159.     jmp endCheck
  160.    
  161.     writeThis:
  162.    
  163.     mov dx,offset ISLOAD
  164.     call PRINT
  165.    
  166.     mov ISLOADBOOL,0001h;устанавливаем флаг
  167.    
  168.     endCheck:
  169.    
  170.     pop es
  171.     pop bx
  172.     pop ax
  173.     ret
  174. CHECKINTERRUPTS ENDP
  175.  
  176.  
  177. REPLACEINTERRUPT PROC near
  178.     push ax
  179.     push DS
  180.     push dx
  181.     mov DX,offset ROUT
  182.     mov AX,seg ROUT
  183.     mov DS,AX
  184.     mov AH,25h
  185.     mov AL,1ch
  186.     int 21h
  187.     pop dx
  188.     pop DS
  189.     pop ax
  190.     ret
  191. REPLACEINTERRUPT ENDP
  192.  
  193. FREE_MEMORY PROC near
  194.     ;получаем сегмент и смещение
  195.     mov ah,35h
  196.     mov al,1ch
  197.     int 21h
  198.     xor ax,ax
  199.    
  200.     ;замена на старое прерывание -- ok
  201.     cli
  202.     push ds
  203.     mov dx,es:KEEP_IP
  204.     mov ax,es:KEEP_CS
  205.     mov ds,ax
  206.     mov ah,25h
  207.     mov al,1ch
  208.     int 21h
  209.     pop ds
  210.     sti
  211.    
  212.    
  213.     ;освобождение памят
  214.     ;-----------------------
  215.     mov ax,es:PSP
  216.     mov es,ax
  217.     push es
  218.    
  219.     mov ax,es:[2ch];адрес среды передоваемыой системе
  220.     mov es,ax
  221.    
  222.     ;освобождение памяти среды
  223.     mov ah,49h
  224.     int 21h
  225.    
  226.     ;освобождение сегмента
  227.     pop es
  228.     mov ah,49h
  229.     int 21h
  230.     ;-----------------------
  231.     mov dx,offset DELETEMEMORY
  232.     call PRINT
  233.    
  234.     ret
  235. FREE_MEMORY ENDP
  236.  
  237. SAVE_MEMORY proc near
  238.     push ax
  239.     push bx
  240.     push dx
  241.     push cx
  242.     ;выводим сообщение о загрузке
  243.     mov dx,offset LOADACCEPT
  244.     call PRINT
  245.    
  246.     ;рассчитываем необходимую память
  247.     ;--------------------------
  248.     mov DX,offset LAST_BYTE
  249.     mov cl,4h
  250.     shr dx,cl
  251.     inc dx
  252.     mov ax,cs
  253.     sub ax, PSP
  254.     add dx,ax
  255.     xor ax,ax
  256.     mov ah,31h
  257.     int 21h
  258.     ;--------------------------
  259.    
  260.     pop cx
  261.     pop dx
  262.     pop bx
  263.     pop ax
  264.    
  265.     ret
  266. SAVE_MEMORY ENDP
  267.  
  268. CHECK_FLAG PROC near
  269.     xor cx,cx
  270.     mov cl,es:[80h];берем количство символов в tail
  271.    
  272.     cmp cl,4 ;если оно не равно 4, то флаг не меняем
  273.     jne endCheckFlag
  274.    
  275.     ;посимвольно сравниваем tail с нужным флагом
  276.     ;---------------------------------
  277.     mov bx,0
  278.     mov al, es:[81h+bx]
  279.     cmp al,'/'
  280.     je endCheckFlag
  281.    
  282.     inc bx
  283.     mov al, es:[81h+bx]
  284.     cmp al,'u'
  285.     je endCheckFlag
  286.    
  287.     mov al, es:[81h+bx]
  288.     cmp al,'n'
  289.     je endCheckFlag
  290.     ;---------------------------------
  291.    
  292.     ;устанавливаем флаг и выводим на экран сообщение
  293.     mov FLAGBOOL,0001h
  294.     mov dx,offset NEEDUNLOUD
  295.     call PRINT
  296.    
  297.     endCheckFlag:
  298.     ret
  299. CHECK_FLAG ENDP
  300.  
  301. Main PROC FAR
  302.     ;помещаем сегмент данных в ds
  303.     mov AX,DATA
  304.     mov DS,AX
  305.     ;сохраняем psp
  306.     mov PSP,es
  307.     ;проверяем установлен ли /un
  308.     call CHECK_FLAG
  309.     ;проверяем установлено ли новое прерывание
  310.     call CHECKINTERRUPTS
  311.    
  312.     ;если новое прерывание установлено, то флаг 0 поменяется на 1
  313.     cmp ISLOADBOOL,0001h
  314.     je needUnloudm
  315.    
  316.     cmp FLAGBOOL,0001h ;если флаг установлен, но не загружено новое прерывание в память
  317.     je endMain
  318.    
  319.     ;заменяем прерывание на наше и загружаем в резидентную память
  320.     call REPLACEINTERRUPT
  321.     call SAVE_MEMORY
  322.    
  323.     needUnloudm:
  324.    
  325.     cmp FLAGBOOL,0001h; если флаг установлен, но загружено новое прерывание в память
  326.     jne endMain
  327.    
  328.     call FREE_MEMORY;освобождаем память
  329.    
  330.     endMain:
  331.    
  332.     mov  ah, 4ch                
  333.     int  21h
  334.     LAST_BYTE:
  335. Main ENDP
  336.  
  337. CODE ENDS
  338.  
  339.  
  340.  END Main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement