| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
лера. Что поможет вам в этом случае? Турбо Си дает ответ на этот
вопрос (фактически три ответа): псевдопеременные, встроенный ас-
семблер и функции прерывания. Прочтите эту главу, и вы поймете,
как каждый из них поможет выполнить вашу работу.
Псевдопеременные
-----------------------------------------------------------------
Процессор в вашей ЭВМ (8088/8086/80186/80286) имеет опреде-
ленное число регистров (или специальных элементов хранения), ко-
торые он использует для манипулирования величинами. В каждом ре-
гистре 16 разрядов (2 байта); некоторые из них выполняют
специальные функции, хотя часть из них может быть использована и
в качестве регистров общего назначения. Вспомните "Модели памя-
ти", рассмотренные в начале этой главы, для подробного рассмотре-
ния этих регистов процессора.
Иногда (в низкоуровневом программировании) вам может понадо-
биться обращение непосредственно к этим регистрам из Си-программы
для:
- загрузки в них значений перед вызовом системных подпрог-
рамм;
- просмотра значений, содержащихся в них в настоящее время.
Турбо Си очень просто позволит вам обратиться к этим регист-
рам через псевдопеременные. Псевдопеременные - это просто иденти-
фикаторы, которые соответствуют данным регистрам. Их можно ис-
пользовать по аналогии с переменными типа unsigned int или
unsigned char.
В таблице 12.6 приведен полный список псевдопеременных, ко-
торые можно использовать, их типы, регистры, которым они соот-
ветствуют, и для чего эти регистры обычно используются.
- 411,412 -
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Псевдо - Назначение
переменные Тип Регистр регистра
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
_AX unsigned int AX РОН / аккумулятор
_AL unsigned char AL младший байт AX
_AH unsigned char AH старший байт AX
_BX unsigned int BX РОН / индексный
_BL unsigned char BL младший байт BX
_BH unsigned char BH старший байт BX
_CX unsigned int CX РОН/счетчик,счетчик
цикла
_CL unsigned char CL младший байт CX
_CH unsigned char CH старший байт CX
_DX unsigned int DX РОН / содержащий данные
_DL unsigned char DL младший байт DX
_DH unsigned char DH старший байт DX
_CS unsigned int CS сегмент кода
_DS unsigned int DS сегмент данных
_SS unsigned int SS сегмент стека
_ES unsigned int ES дополнительный сегмент
_SP unsigned int SP указатель стека
(смещение относительно SS)
_BP unsigned int BP указатель базы
(смещение относительно SS)
_DI unsigned int DI Используется для
регистровых переменных
_SI unsigned int SI Используется для
регистровых переменных
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Таблица 12.6. Псевдопеременные Турбо Си
Для чего же вам может понадобиться прямое обращение к этим
переменным из Турбо Си ?
- 413,414 -
Для занесения в регистр некоторого значения перед вызовом
низкоуровневой подпрограммы. Например, можно вызвать определенную
подпрограмму из ПЗУ, используя INT (прерывание), но обязательно с
предварительным занесением необходимой информации в определенные
регистры, например так:
void readchar (unsigned char page, unsigned char *ch,
unsigned char *attr);
(
_AH = 8; /*Код операции: прочитать знак, аттрибут */
_BH = page; /* номер страницы дисплея*/
geninterrupt(0*10) /* вызов прерывания INT 10h */
*ch = _AL; /* получение кода ASCII считанного знака */
*attr = _AH; /* получение аттрибута считанного знака */
)
Вы видите, что код операции и номер страницы дисплея переда-
ются в подпрограмму по INT 10h, а возвращаемые значения копируют-
ся в ch и attr.
C псевдопеременными можно обращаться так, будто это обычные
глобальные переменные соответствующего типа (unsigned int или
unsigned char). Однако то, что они ссылаются на регистры процес-
сора, а не на ячейки, накладывает на их использование ряд ограни-
чений и соглашений:
- вы не можете использовать оператор адреса (&) совместно с
псевдопеременной, т.к. псевдопеременная не имеет адреса;
- так как компилятор генерирует команды, использующие ре-
гистры, то нет никакой гарантии того, что значения, занесенные в
псевдопеременные, будут храниться там длительное время. Это зна-
чит, что вы должны заносить значения в регистры непосредственно
перед выполнением запроса и выбирать из них результат сразу же
после его завершения, как, например, в предыдущем случае с
readchar. Это особенно касается регистров общего назначения
(AX,AH,AL и т.п.), т.к. компилятор свободно использует их как
временную память, и, кроме того, сам процессор изменяет их в про-
извольные моменты времени, используя, например, CX для установки
организации цикла при выполнении операции сдвига, или DX - для
хранения старшего слова при 16-битном умножении;
- нет полной уверенности в том, что занесенная в регистр ве-
личина сохранится при выполнении вызова функции. Например:
- 415,416 -
_CX = 18;
myFunc();
i = _CX ;
Во время вызова функции сохраняются не все регистры, и нет
гарантии, что i получит значение 18. Надежно, до и после вызова
функции, величины хранятся лишь в регистрах _CS,_BP,_SI и _DI;
- необходимо очень осторожно использовать некоторые регист-
ры, т.к. это может привести к неожиданным и неблагоприятным ре-
зультатам. Например, прямое сохранение величин в _CS,_SS,_SP или
_BP может стать (и почти всегда будет) причиной того, что ваша
программа будет работать неустойчиво, т.к. код, создаваемый ком-
пилятором Турбо Си, использует эти регистры для других целей.
Использование встроенного ассемблера
-----------------------------------------------------------------
Вы уже видели, как надо писать отдельные подпрограммы на ас-
семблере и компоновать их с программами на Турбо Си. Кроме этого
Турбо Си позволяет использовать команды ассемблера непосредствен-
но в Си программе. Это называется встроенным ассемблером.
Для того, чтобы использовать встроенный ассемблер в Си-прог-
рамме, вы должны использовать опцию компилятора -В. Если вы не
используете эту опцию, и компилятор встретит встроенный ассемб-
лер, то он предупредит вас и закончит свою работу с требованием
запустить его снова с опцией -В. Вы можете избежать этого с по-
мощью введения в программу утверждения #pragma inline, что заме-
нит вам опцию -В, когда компилятор встретит его.
Вам нужно обязательно иметь копию Турбо Ассемблера(TASM). На
первом шаге компилятор создает файл с программой на языке ассемб-
лера, а затем вызывает TАSM, чтобы получить .OBJ файл.
Вам также следует знать архитектуру и набор каманд 8086.
Кроме того, вам необходимо знать, как работают команды, которые
- 417,418 -
вы используете, как можно и как нельзя их применять.
Если вы все это знаете, то вам остается только использовать
ключевое слово asm для того, чтобы вставлять команды встроенного
ассемблера. Это записывается в следующем виде:
asm <код операции> <операнды> <; или символ новой строки>
где:
- <код операции> - допустимая команда 8086 (таблицы с допус-
тимыми командами приведены ниже);
- <операнды> - содержат операнды, допустимые для данной ко-
манды, и могут ссылаться на Си-константы, переменные и
метки;
- <; или символ новой строки> - точка с запятой или новая
строка, указывающие на окончание оператора asm.
|
adfun.ru
|
|
|
|