OutStr macro str ;макрос виведення стрічки
push dx
mov ah,09h
lea dx,str
int 21h
pop dx
endm
OutChar macro char ;макрос виведеня символа
push ax
push dx
mov ah,06h
mov dl,char
add dl,30h
int 21h
pop dx
pop ax
endm
Decomposition macro time ;макрос розкладу двозначного 16-бітного на цифри і виводу їх на екран
push bx
mov bh,time ;використовується bx
mov bl,time
and bh,11110000b
shr bh,4h
and bl,00001111b
OutChar bh
OutChar bl
pop bx
endm
%TITLE "Робота з резидентними програмами."
IDEAL
MODEL small
STACK 256
DATASEG
M1 DB ':$'
M2 DB 'Current time....$'
M3 DB '',10,13,'$'
CODESEG
start:
mov ax,@DATA ;
mov ds,ax
xor ax,ax
mov ah,2h ;отримання часу
int 1Ah
OutStr M2
Decomposition ch ;ch - години
OutStr M1
Decomposition cl ;cl - хвилини
OutStr M1
Decomposition dh ;dh - секунди
OutStr M3
exit:
mov ax,4C00h
int 21h
END start
Резидентные часы
Код:
И есть резидентная програма, которая прокручивает символы в углу екрана.
Код:
CODE SEGMENT
ORG 100H
ASSUME CS:CODE,DS:CODE
BEGIN: JMP START
INT_TIM LABEL DWORD
IP_TIM DW ?
CS_TIM DW ?
TIK DB ?
NCH DB 0
PROCESS: ; НАЧАЛО РЕЗИДЕНТНОЙ ЧАСТИ
CLI ; Запрещение прерываний
INC TIK ; Увеличение счетчика тиков
CMP TIK,10 ; Сравнение его с 10:
JL A1 ; если меньше, то конец прерывания
PUSH ES ; Сохранение регистров в стеке
PUSH AX
MOV AX,0B800H ; Вывод символа по номеру NCH
MOV ES,AX ; прямой записью в видеопамять
XOR AL,AL
MOV TIK,AL
INC NCH
MOV AL,NCH
MOV ES:[0],AL
MOV AL,1EH
MOV ES:[1],AL
POP AX ; Восстановление регистров
POP ES
A1: STI ; Разрешение прерываний
PUSH AX
POP AX
IRET ; Возврат управления
START: ; НАЧАЛО ВСПОМОГАТЕЛЬНОЙ ЧАСТИ
MOV AX,351CH ; Сохранение вектора 1CH
INT 21H
MOV IP_TIM,BX
MOV CS_TIM,ES
MOV AX,251CH ; Установка вектора 1CH
LEA DX,PROCESS ; по адресу метки PROCESS
INT 21H
MOV AL,0 ; Установка начального
MOV TIK,AL ; значения переменной TIK
LEA DX,START ; Установка адреса конца
INT 27H ; резидентной части и KEEP
CODE ENDS
END BEGIN
ORG 100H
ASSUME CS:CODE,DS:CODE
BEGIN: JMP START
INT_TIM LABEL DWORD
IP_TIM DW ?
CS_TIM DW ?
TIK DB ?
NCH DB 0
PROCESS: ; НАЧАЛО РЕЗИДЕНТНОЙ ЧАСТИ
CLI ; Запрещение прерываний
INC TIK ; Увеличение счетчика тиков
CMP TIK,10 ; Сравнение его с 10:
JL A1 ; если меньше, то конец прерывания
PUSH ES ; Сохранение регистров в стеке
PUSH AX
MOV AX,0B800H ; Вывод символа по номеру NCH
MOV ES,AX ; прямой записью в видеопамять
XOR AL,AL
MOV TIK,AL
INC NCH
MOV AL,NCH
MOV ES:[0],AL
MOV AL,1EH
MOV ES:[1],AL
POP AX ; Восстановление регистров
POP ES
A1: STI ; Разрешение прерываний
PUSH AX
POP AX
IRET ; Возврат управления
START: ; НАЧАЛО ВСПОМОГАТЕЛЬНОЙ ЧАСТИ
MOV AX,351CH ; Сохранение вектора 1CH
INT 21H
MOV IP_TIM,BX
MOV CS_TIM,ES
MOV AX,251CH ; Установка вектора 1CH
LEA DX,PROCESS ; по адресу метки PROCESS
INT 21H
MOV AL,0 ; Установка начального
MOV TIK,AL ; значения переменной TIK
LEA DX,START ; Установка адреса конца
INT 27H ; резидентной части и KEEP
CODE ENDS
END BEGIN
Нужно как-то их связать. Или мб кто-то уже делал такие программы - буду очень благодарен за помощь