DIM IntProgd T0 16) AS
RegAX, RegBX, RegCX И RegDX:
DIM IntProgd T0 16) AS INTEGER
' установка сегмента для работы подпрограммы DEF SEG=VARSEG(IntProg(1))
' установка смещения для работы подпрограммы Int33&=VARPTR(IntProgd) )
' Перепись подпрограммы из блока данных в массив F0R J%=0 T0 23
READ K% : P0KE Int33&+J%,K% NEXT J%
Обратите внимание на команды, изменяющие базовый (начальный) адрес сегмента. В качестве новой базы устанавливается адрес начала массива intProg, что позволяет не производить перенастройку адресов машинной программы в зависимости от ее местоположения в оперативной памяти.
В тексте программы, как и в ее прототипе [7], имеется небольшой дефект -после обработки прерывания не запоминается содержимое регистра АХ. А некоторые прерывания заносят в этот регистр результаты своей работы. Например, при опросе текущей даты в младшие разряды регистра АХ зано- сится день недели. Исправить эту оплошность довольно просто -необходимо после команды int добавить команду mov RegAX,ax, которая занимает три байта и в числовом представлении имеет вид АЗ ххуу (здесь ххуу — относительный адрес поля RegDX). При этом адреса переменных RegAX, RegBX, RegCX и RegDX увеличатся на три байта. Но их желательно сохранить на границе полуслова, т. к. с ними оперируют как с элементами целочисленного массива. Поэтому в текст приводимой ниже модификации вставлен еще один байт — пустая команда NOP (числовой код — 90h):
|
|
|
|
|
|
0000
|
IntDos PROC far
|
начало подпрограммы
|
|
|
0000 60
|
pus ha
|
сохранение всех регистров
|
|
|
0001 IE
|
push ds
|
сохранение ds
|
|
|
0002 ОЕ
|
push cs
|
сохранение cs
|
|
|
0003 IF
|
pop ds
|
пересылка cs в ds
|
|
|
0004 Al 001C
|
mov ax, RegAX
|
пересылка поля RegAX в ах
|
|
|
0007 90
|
пор
|
для выравнивания границы
|
|
|
0008 CD 33
|
int 33h
|
прерывание с номером 33h
|
|
|
ОООА A3 001С
|
mov RegAX, ax
|
запоминание регистра ах
|
|
|
OOOD 89 IE 001E
|
mov RegBX,bx
|
запоминание регистра Ьх
|
|
|
ООН 89 ОЕ 0020
|
mov RegCX, ex
|
запоминание регистра сх
|
|
|
0015 89 16 0022
|
mov RegDX,dx
|
запоминание регистра dx
|
|
|
0019 IF
|
pop ds
|
восстановление ds
|
|
|
001А 61
|
popa
|
восстановление регистров
|
|
|
001В СВ
|
ret
|
возврат из подпрограммы
|
|
|
001С 0000
|
RegAX DW 0
|
поле для содержимого ах
|
|
|
001Е 0000
|
RegBX DW 0
|
поле для содержимого Ьх
|
|
|
0020 0000
|
RegCX DW 0
|
поле для содержимого сх
|
|
|
0022 0000
|
RegDX DW 0
|
поле для содержимого dx
|
|
|
|
IntDos ENDP
|
конец подпрограммы
|
|
|
|
|
|
|
<
Содержание Назад Вперед