Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Системный Си.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
98.3 Кб
Скачать

http://khpi-iip.mipk.kharkiv.edu/library/sp/book/index.html

2. Специальные средства языка Турбо-Си

Традиционно считалось, что единственным языковым средством, дающим полный доступ к аппаратным средствам ЭВМ, является язык Ассемблера. Применительно к ПЭВМ это не совсем так. Многие языки, системы программирования которых реализованы на ПЭВМ, имеют в своем арсенале такие средства, в частности язык Си, который был разработан в 1972 году Д.Ритчи именно как язык системного программиста для написания операционных систем (системы UNIX). Не следует, однако, считать, что средства низкоуровневого доступа являются исключительной прерогативой языка Си - они есть и в других языках, например, программные иллюстрации в [4] базируются на Паскале, а в [6] - на Бэйсике. Популярность Си для целей системного программирования обусловлена наряду с наличием упомянутых средств (а может быть и в первую очередь) высокой эффективностью объектных кодов, вырабатываемых Си-трансляторами.

В данной работе использовалась версия 2.0 системы программирования Турбо-Си. Выбор языка Си в качестве базового для нашего пособия объясняется также и тем, что запись интересующих нас в первую очередь обращений к аппаратным и системным средствам в языке Си весьма "прозрачна" и соответствующие фрагменты текста Си-программ легко могут быть спроецированы на язык Ассемблера или на какой-либо другой язык высокого уровня. Не следует рассматривать наше пособие как пособие по программированию на языке Си. В целом ряде программ мы сознательно отказывались от присущих языку Си компактности и изящества, чтобы сделать тексты программ более удобочитаемыми. Кроме того, в системах программирования Си очень многие обращения к DOS и к BIOS реализованы в виде стандартных функций (в Турбо-Си описания этих функций находятся в файлах DOS.H и BIOS.H), мы же в наших программных примерах игнорировали наличие таких функций, чтобы достичь большего соответствия с Ассемблерным программированием.

2.1. Доступ к регистрам

1). В любой программе, разрабатываемой в среде Турбо-Си по умолчанию предопределены имена: _AX, _AL, _AH, _BX, _BL, _BH, _CX, _CL, _CH, _DX, _DL, _DH, _ES, _SS, _CS, _DS, _SI, _DI, _BP, _SP. Эти переменные (т.наз. псевдорегистры) типа int и char могут быть использованы для доступа к регистрам микропроцессора.

2). При обращениях к прерываниям передача входных и выходных параметров происходит через регистры. Для этих целей используются следующие описания данных, находящиеся в файле DOS.H (там же находятся и описания всех рассматриваемых далее функций и макросов). Объединение REGS, используемое для задания содержимого регистров общего назначения:

union REGS {

struct WORDREGS x;

struct BYTEREGS h;

};

struct WORDREGS {

unsigned int ax, bx, cx, dx;

unsigned int si, di, cflag, flags;

};

struct BYTEREGS {

unsigned char al, ah, bl, bh;

unsigned char cl, ch, cl, dh;

};

Поле flags структуры WORDREGS отражает состояние флагов микропроцессора, а поле cflag - состояние системного флага переноса CY, в котором обычно при обращениях к DOS и к BIOS индицируется ошибка. Использование объединения REGS позволяет программисту обращаться к регистру общего назначения как к целому двухбайтному слову или к каждому байту этого слова, выбирая описатель второго уровня x или h соответственно. Так, если в программе имеется определение:

union REGS rr;

то результаты выполнения операторов:

rr.x.ax=0x1122;

и:

rr.h.ah=0x11; rr.h.al=0x22;

будут одинаковы. Структура SREGS, служащая для задания содержимого сегментных регистров:

struct SREGS {

unsigned int es, cs, ss, ds;

};

Наконец, структура REGPACK, обеспечивающая наиболее полный набор регистров микропроцессора:

struct REGPACK {

unsigned int r_ax, r_bx, r_cx, r_dx;

unsigned int r_bp, r_si, r_di;

unsigned int r_ds, r_es, r_flags;

};

Данные этих типов служат агрументами функций обращения к прерываниям.

3). Интересный способ доступа к регистрам возможен в программах обработки прерываний, он будет рассмотрен ниже вместе с такими программами.