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



         

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


/p>

Если вам понадобится вставить в текст подобной программы другие машинные команды, то для определения их цифровых кодов советуем зайти в программу td.exe (Turbo Debugger — Турбо Отладчик). Эта программа входит в комплект поставки любой Borland-системы. Набирая в окне ввода команды на языке ассемблера, вы сразу же увидите их аналог в шестнадцатеричной кодировке.

Замену команды INT 33h на команду INT 21h в новом варианте можно выполнить следующим образом:

IntProg(5)=SH21CD

Из-за того, что код операции команды INT занимает младший байт полуслова, т. е. байт с меньшим адресом, а номер прерывания — старший байт, в целочисленной константе &H21CD соответствующие значения переставлены местами. Наверное, вы уже обратили внимание на аналогичные перестановки байтов в двух байтовых адресах команд mov.

Задание номера подфункции, который должен попасть в регистр АХ, следует выполнить путем присвоения нужного значения элементу массива intProg, соответствующего полю RegAX. Так как нулевой адрес ссылается на начало этого массива, т. е. на элемент intProg(1), то адрес &Н1С=28 определяет местоположение элемента intProg(15). Поэтому адреса полей "регистров" АХ,

ВХ, СХ и DX

указывают на элементы

IntProg(15), IntProg(16), IntProg(17)

И

IntProg(18).

После выполнения подпрограммы обработки прерывания необходимо извлечь полученные данные из элементов массива intProg, в которых были сохранены значения соответствующих регистров.

Ниже приведен текст программы опроса текущей даты на Бейсике, использующий в качестве подпрограммы обработки прерывания расширенную версию машинных кодов.

Программа 10_2.bas

DATA &Н60,&Н1Е,SH0E,&H1F,&НА1,&Н1С,&Н00, &Н90, &HCD, &НЗЗ

DATA &HA3,&H1C,&H00,&H89,&H1E,&H1E,SH00,SH89,&H0E,&H20

DATA &H00,&H89,&Д16,&H22,&H00,&H1F,&H61,&HCB

DIM IntProg(1 T0 18) AS INTEGER

'установка сегмента для работы подпрограммы

DEF SEG=VARSEG(IntProg(1))

'установка смещения для работы подпрограммы

Int33& = VARPTR{IntProg(1))

'Перепись подпрограммы из блока данных в массив

F0R J%=0 T0 27

READ K%: P0KE Int33&+J%,К% NEXT J%

IntProg(5)=&H21CD IntProg(15)=&H2A00 CALL ABS0LUTE(Int33&)

F0R K=15 T0 18

PRINT IntProg(K) NEXT К WeekDay=IntProg(15) M0D 256: ' День недели = AL

Day=IntProg(18) MOD 256: ' День месяца = DL

Month=IntProg(18) 256: ' Номер месяца = DH

Year=IntProg(17): ' Год = CX

PRINT USING "Сегодня - ##/##/#### - #";Day;Month;Year;WeekDay

DEF SEG

END




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