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 |
конец подпрограммы |
||