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


         

Глава 10. - часть 6


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

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

<


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