Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- AStack SEGMENT STACK
- DB 2048 DUP(?)
- AStack ENDS
- DATA SEGMENT
- LOADACCEPT db 'loading is complete',0DH, 0AH,'$'
- DELETEMEMORY db 'Mem free',0DH, 0AH,'$'
- NEEDUNLOUD db 'The / un flag is set',0DH, 0AH,'$'
- ISLOAD db 'Interrupt already loaded',0DH, 0AH,'$'
- ISLOADBOOL dw 0000h
- FLAGBOOL dw 0000h
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA, SS:AStack
- keep dd ?
- ROUT PROC FAR
- jmp start
- PSP dw ?
- Signature dw 00FFh
- KEEP_CS DW 0 ; для хранения сегмента
- KEEP_IP DW 0
- SUM DW 0000h
- COUNTTEXT db 'Count:','$'
- start:
- push ax
- push cx
- push bx
- push dx
- ;запоминаем курсор
- ;-----------------------------
- mov ah,03h
- mov bh,0
- int 10h
- push dx
- ;-----------------------------
- ;задаем новое положение
- ;-----------------------------
- mov dh,10
- mov dl,40
- mov ah,02h
- mov bh,0
- int 10h
- ;-----------------------------
- ;выводим сообщение из памяти
- ;-----------------------------
- mov ax,seg COUNTTEXT
- mov es,ax
- mov bp,offset COUNTTEXT
- mov ah,13h
- mov al,1
- mov bl,1
- mov bh,0
- mov cx,6;длина строки
- int 10h
- ;-----------------------------
- mov ax,SUM
- inc ax
- mov SUM,ax
- ;выводим число,переводя het to dec.
- ;-----------------------------
- xor cx, cx
- xor dx,dx
- mov bx, 0ah ; основание сс. 10 для десятеричной и т.п.
- loop_to:
- div bx
- push dx
- inc cx
- xor dx,dx
- test ax, ax
- jne loop_to
- write:
- pop dx
- add dl, '0'
- mov al,dl
- push cx
- ;сдвиг
- ;-----------------------------
- mov ah,03h
- mov bh,0
- int 10h
- inc dl
- mov ah,02h
- mov bh,0
- int 10h
- ;-----------------------------
- ;вывод символа
- mov ah,09h
- mov bh,0
- mov cx,1
- int 10h
- pop cx
- loop write
- ;-----------------------------
- ;возвращаем старое положение курсора
- ;-----------------------------
- pop dx
- mov ah,02h
- mov bh,0
- int 10h
- ;-----------------------------
- pop dx
- pop bx
- pop cx
- pop ax
- mov al,20h
- out 20h,al
- iret
- ROUT ENDP
- PRINT PROC near
- push ax
- mov AH, 09h ;Ќ®¬Ґа дгЄжЁЁ 09h
- int 21h
- pop ax
- ret
- PRINT ENDP
- CHECKINTERRUPTS proc near
- push ax
- push bx
- push es
- mov ah,35h
- mov al,1ch
- int 21h
- mov KEEP_IP,bx
- mov KEEP_CS,es
- ;проверка по signature, которое содержится в памяти
- ;-------------------------
- mov ax,Signature
- mov si, offset Signature
- sub si, offset ROUT
- cmp ax,es:[bx+si]
- ;-------------------------
- je writeThis
- jmp endCheck
- writeThis:
- mov dx,offset ISLOAD
- call PRINT
- mov ISLOADBOOL,0001h;устанавливаем флаг
- endCheck:
- pop es
- pop bx
- pop ax
- ret
- CHECKINTERRUPTS ENDP
- REPLACEINTERRUPT PROC near
- push ax
- push DS
- push dx
- mov DX,offset ROUT
- mov AX,seg ROUT
- mov DS,AX
- mov AH,25h
- mov AL,1ch
- int 21h
- pop dx
- pop DS
- pop ax
- ret
- REPLACEINTERRUPT ENDP
- FREE_MEMORY PROC near
- ;получаем сегмент и смещение
- mov ah,35h
- mov al,1ch
- int 21h
- xor ax,ax
- ;замена на старое прерывание -- ok
- cli
- push ds
- mov dx,es:KEEP_IP
- mov ax,es:KEEP_CS
- mov ds,ax
- mov ah,25h
- mov al,1ch
- int 21h
- pop ds
- sti
- ;освобождение памят
- ;-----------------------
- mov ax,es:PSP
- mov es,ax
- push es
- mov ax,es:[2ch];адрес среды передоваемыой системе
- mov es,ax
- ;освобождение памяти среды
- mov ah,49h
- int 21h
- ;освобождение сегмента
- pop es
- mov ah,49h
- int 21h
- ;-----------------------
- mov dx,offset DELETEMEMORY
- call PRINT
- ret
- FREE_MEMORY ENDP
- SAVE_MEMORY proc near
- push ax
- push bx
- push dx
- push cx
- ;выводим сообщение о загрузке
- mov dx,offset LOADACCEPT
- call PRINT
- ;рассчитываем необходимую память
- ;--------------------------
- mov DX,offset LAST_BYTE
- mov cl,4h
- shr dx,cl
- inc dx
- mov ax,cs
- sub ax, PSP
- add dx,ax
- xor ax,ax
- mov ah,31h
- int 21h
- ;--------------------------
- pop cx
- pop dx
- pop bx
- pop ax
- ret
- SAVE_MEMORY ENDP
- CHECK_FLAG PROC near
- xor cx,cx
- mov cl,es:[80h];берем количство символов в tail
- cmp cl,4 ;если оно не равно 4, то флаг не меняем
- jne endCheckFlag
- ;посимвольно сравниваем tail с нужным флагом
- ;---------------------------------
- mov bx,0
- mov al, es:[81h+bx]
- cmp al,'/'
- je endCheckFlag
- inc bx
- mov al, es:[81h+bx]
- cmp al,'u'
- je endCheckFlag
- mov al, es:[81h+bx]
- cmp al,'n'
- je endCheckFlag
- ;---------------------------------
- ;устанавливаем флаг и выводим на экран сообщение
- mov FLAGBOOL,0001h
- mov dx,offset NEEDUNLOUD
- call PRINT
- endCheckFlag:
- ret
- CHECK_FLAG ENDP
- Main PROC FAR
- ;помещаем сегмент данных в ds
- mov AX,DATA
- mov DS,AX
- ;сохраняем psp
- mov PSP,es
- ;проверяем установлен ли /un
- call CHECK_FLAG
- ;проверяем установлено ли новое прерывание
- call CHECKINTERRUPTS
- ;если новое прерывание установлено, то флаг 0 поменяется на 1
- cmp ISLOADBOOL,0001h
- je needUnloudm
- cmp FLAGBOOL,0001h ;если флаг установлен, но не загружено новое прерывание в память
- je endMain
- ;заменяем прерывание на наше и загружаем в резидентную память
- call REPLACEINTERRUPT
- call SAVE_MEMORY
- needUnloudm:
- cmp FLAGBOOL,0001h; если флаг установлен, но загружено новое прерывание в память
- jne endMain
- call FREE_MEMORY;освобождаем память
- endMain:
- mov ah, 4ch
- int 21h
- LAST_BYTE:
- Main ENDP
- CODE ENDS
- END Main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement