Программирование игр для Windows. Советы профессионала

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


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

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

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

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

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

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

§

BYTE

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

§          WORD

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

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

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

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

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

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

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



Содержание раздела