Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Листинг 2.7. Ассемблерная часть примера.

ВВЕДЕНИЕ | ВИДЕОИГРЫ. ПЕРВЫЕ ШАГИ... | ОСНОВЫ ЯЗЫКА АССЕМБЛЕРА | Листинг 2.1. Прототип процедуры для MASM 5.0 и более старших версий. | Листинг 2.2. Простая процедура сложения. | Листинг 2.3. Модифицированная версия Add_Int. | Листинг 2.4. Корректировка регистра SP. | Листинг 2.11, Программа на Си для тестирования программы 2.10 (FILLC.C). | ОСНОВЫ РАБОТЫ С УСТРОЙСТВАМИ ВВОДА | Листинг 3.1. Чтение кнопок джойстика. |


Читайте также:
  1. II. Основная часть
  2. II. Основная часть
  3. II. Основная часть
  4. II. Основная часть
  5. II. Основная часть
  6. II. Основная часть
  7. II. Основная часть

.MODEL MEDIUM; будем использовать MEDIUM модель

EXTRN first:WORD, second:WORD, third:WORD

.CODE; начало кодового сегмента

_Add_Ext PROC FAR;процедура имеет тип FAR (дальняя)

mov AX, first; помещаем первое число в аккумулятор

add AX, second; прибавляем второе число

mov third, AX; помещаем результат в переменную third

_Add_Ext ENDP; конец процедуры

END; конец кодового сегмента

Листинги 2.6 и 2.7 - это примеры использования внешних переменных first, second и third. Программа вызывает Add_Ext, которая складывает переменные first и second и сохраняет результат в third. Это подводит нас к теме возврата результатов обратно в программу на Си, которая вызывала ассемблерную процедуру.

Возвращение параметров в вызывающую функции

Когда Си только начинал создаваться, одним из требований в спецификациях называлась «функциональность» языка. Под функциональностью я понимаю возвращение результата и возможность использования комплексных выражений. Например, рассмотрим следующее выражение на Си:

coeff = Factorial(n)*cos(r)*Scale(z);

Это выражение использует три функции и выполняет требуемые математические операции. Результат сохраняется в переменной coeff. Именно это и делает Си «функциональным» языком.

Конечно, это только одна из многих возможностей Си. Таким образом, если мы хотим эмулировать с помощью ассемблера настоящие Си-функции, мы должны иметь возможность возвратить результат в вызывающую функцию, как это делает Си.

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

В зависимости от типа, возвращаемые в Си параметры должны находиться в следующих регистрах:

§ BYTE возвращается в регистре AL;

§ WORD возвращается в регистре АХ;

§ DWORD должно возвращаться,в, паре DX:AX, причем в АХ записывается

§ младшее слово;

§ Указатели типа NEAR должны возвращаться в регистре АХ;

§ Указатели типа FAR Возвращаются в паре DX:AX, причем в DX должен содержаться сегмент, а в АХ - смещение.

Давайте для примера вспомним Листинг 2.2, где мы складывали два целых числа и накапливали результат в АХ. К счастью, это именно тот регистр, в котором целое значение может быть возвращено в Си-программу. Если же встречается другая ситуация, (например, результат находится в регистре СХ). то для корректной передачи результата мы должны перед выходом переместить полученное значение в АХ.

 

Так... Вроде бы, с директивами и техникой программирования на ассемблере MASM мы покончили. Теперь я предлагаю перейти к более живым примерам. Кстати, для них-то все это и написано.

Установка видеорежимов

В играх есть немало технических хитростей: работа со звуком, «искусственный интеллект» и многое другое. Но перед тем как начать этим заниматься, давайте попробуем инициализировать наш дисплей.

Конечно, мы сразу можем набрать гору документации с подробным описанием устройства дисплея, регистров и установок, но все это весьма опасно, и вот почему. То, что будет работать на одной видеокарте, может оказаться абсолютно неработоспособным на другой. Таким образом, чтобы избежать возможной несовместимости, для установки видеорежима мы будем использовать базовую систему ввода/вывода (BIOS).

Можно смело сказать, что основная графическая мощь ПК сосредоточена в прерывании с номером 10h. Использование этого прерывания весьма просто — необходимо правильно установить нужные регистры процессора в зависимости от выполняемой функции. В этой книге мы будем пользоваться режимом 13h (это графический режим с разрешением 320х200 точек, при 256 цветах). Теперь нам нужно найти, как перенести компьютер в этот режим. Для этого давайте напишем программу на ассемблере для установки режима 13h и программу на Си для проверки. Соответствующие фрагменты показаны в Листингах 2.8 и 2.9.


Дата добавления: 2015-07-12; просмотров: 95 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Листинг 2.5. Программа Timer.| Листинг 2.9. Си-функция, тестирующая видеорежим (SETMOPEC.C).

mybiblioteka.su - 2015-2024 год. (0.007 сек.)