Практика программирования (Бейсик, Си, Паскаль)


         

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


конец подпрограммы

<

Содержание  Назад  Вперед