Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Ptr_dword/3

Этот предикат сообщает абсолютный адрес StringVar или помещает

StringVar в определенном месте памяти.

ptr_dword(StringVar,Seg,Off) /*(o,i,i),(i,o,o)*/

Если StringVar связана, то предикат ptr_dword возвращает номер сег-

мента (seg) и смещение (offset) строки StringVar. Если связаны seg и off,

ptr_dword связывает StringVar со строкой, которая содержится в этом мес-

те.

Строкой в Турбо Прологе является последовательность символов ASCII,

заканчивающаяся пустым символом. Вы можете использовать процедуры низкого

уровня для обработки ненормальных строк (тех, что содержат несколько ну-

левых байт). Однако, вы не можете осуществлять вывод ненормальных строк

или включать их в базу данных.

Membyte/3 и memword/3

Турбо Пролог содержит предикаты для выборки и изменения определенных

элементов памяти. membyte используется для доступа к определенному байту

памяти, а memword используется для доступа к слову (состоящему из двух

байт). Формат обоих предикатов:

membyte(Segment, Offset, Byte) /*(i,i,i),(o,i,i)*/

memword(Segment, Offset, Word) /*(i,i,i),(o,i,i)*/

Segment,Offset,Byte и Word являются величинами целого типа. Многие

из обращений к bios требуют, чтобы передавались пары типа Segment:Offset.

membyte и memword тоже требуют указателей в таком виде. Положение участка

памяти при этом вычисляется в виде: ((Segment*16)+Offset).

Так как в Турбо Прологе определены целые числа со знаком (в проме-

жутке от -32768 до 32767 ), величины, сообщаемые предикатом memword могут

быть отрицательными. Эти числа соответствуют промежутку от 32768 до

65536.

Port_byte/2

Этот предикат позволяет прочитать/записать байт в определенный буфер

ввода/вывода. Формат предиката:

port_byte(PortAddress, Byte) /*(i,i),(i,o)*/

При этом PortAddress и Byte являются переменными целого типа. Допол-

нительная информация о буферах ввода/вывода содержится в справочном руко-

водстве ДОС.

Примеры:

1) Предложение set_mode использует membyte для получения информации

из 449 байта памяти (он содержит информацию о текущем состоянии дисплея).

Кроме того, set_mode использует memword для получения информации из байта

463, содержащего адрес текущего адаптера дисплея.

Затем, предикат выводит полученные величины, запрашивает пользовате-

ля о новом состоянии дисплея (от 0 до 7) и использует предикат port_byte

для установки нового состояния дисплея (в предположении, что введенная

величина имеет смысл для используемого адаптера).

set_mode:-

membyte(S0000,S0449,X),

memword(S0000,S0463,PortAddress),

write("Current mode setting is:",X), nl,

write("Enter new mode (0-7):"),

readint(NewMode),

NewMode <=7,

port_byte(PortAddress, NewMode).

2) Программа CH16EX04.PRO использует стандартные предикаты bios и

ptr_word для определения 4 предикатов:

dosver - возвращает номер версии ДОС,

diskspase - возвращает общий объем памяти и объем сворбодной

памяти на диске. Диск определяется номером:

0 - диск по умолчанию;

1 - диск А;

2 - диск В; и т.д.

makedir - создает подкаталог,

removedir - удаляет подкаталог.

Эта программа приведена ниже:

/*Program CH16TX04.PRO*/

predicates

dosver(real)

diskspace(real,real,real)

makedir(string)

removedir(string)

clauses

dosver(Version):-AX= 48*256

bios(33,reg(AX,0,0,0,0,0,0,0), reg(VV,-,-,-,-,-,-,-)),

/* Вы должны использовать 16-ричное представляение,

bios(S21...) вместо bios(33...)*/

L=VV/256, H=VV-256*L, Version=H+L/100

diskspace(Disk,TotalSpace,FreeSpace):-

AAX=54*256,

bios(33, reg(FFX,0,0,DISK,0,0,0,0),

reg(AX,BX,CX,DX,-,-,-,-)),

FreeSpace = 1.0*BX*CX*AX, TotalSpase = 1.0*DX*CX*AX.

makedir(Name): -

ptr_dword(Name,DS,DX),

AX=256*57,

bios(33, reg(AX,0,0,DX,0,0,DS,0),-).

removedir(Name): -

ptr_dword(Name,DS,DX), AX=256*58,

bios(33,reg(AX,0,0,DX,0,0,DS,0),-).

Задайте программе CH16EX04.PRO следующие цели:

dosver(DosVersionNumber). /*goal 1 */

diskspace(DriveNumber, TotalSpace, RemainingSpace)

/*goal 2 */

makedir("testdir"), /*goal 3 */

readchar(-), system("dir"), removedir("testdir"),

readchar(-),

system("dir").

Обзор

Ниже приведены основные темы, затронутые в этой главе.

1) Турбо Пролог включает несколько предикатов, которые:

а)осуществляют доступ к ДОС;.

б)выполняют битовые логические операции и операции сдвига;

в)обеспечивают поддержку низкого уровня для манипулирования

BIOS, памятью, другими элементами аппаратуры.

2) Следующие предикаты дают доступ к ДОС:

а)system (возможность обращения к любой команде ДОС);

б)time (установка или чтение показаний встроенных часов);

в)date (доступ к встроенному календарю);

г)envsimbol (доступ к таблице идентификаторов ДОС);

д)comline (чтение аргументов командной строки ДОС);

3) Предикаты, выполняющие побитовые операции:

а)bitor (логическое OR);

б)bitand (логическое И);

в)bitnot (логическое НЕ);

г)bitxor (логическое исключающее ИЛИ);

д)bitleft (сдвиг влево);

е)bitright (сдвиг вправо).

4) Предикаты, обеспечивающие поддержку связи с элементами аппара-

туры:

а)bios (доступ к процедурам BIOS);

б)ptr_dword (возврат адреса аргумента или помещение аргумента

в заданное место памяти);

в)memword (выбирает или помещает двухбайтную величину);

г)membyte (выбирает или помещает однобайтную величину);

д)port_byte (ввод/вывод байта в буфер ввода/вывода).

Соседние файлы в папке Документация