Фундаментальные основы хакерства


Идентификация аргументов функций - часть 53


При наличии же "живого" сопроцессора появляются чисто процессорные типы Single, Double, Extended и Comp, соответствующие float, double, long double и __int64.

Функциям математической библиотеки, обеспечивающий поддержу вычислений с плавающей запятой, вещественные аргументы передаются через регистры: в AX, BX, DX помещается первый слева аргумент, а в CX, SI, DI – второй (если он есть). Системные функции сопряжения с интерфейсом процессора (в частности, функции преобразования Real в Extended) принимают аргументы через регистры, а результат возвращают через стек сопроцессора. Наконец, прикладные функции и процедуры получают вещественные аргументы через стек основного процессора.

В зависимости от настроек компилятора программа может компилироваться либо с использованием встроенной математической библиотеки (по умолчанию), либо с непосредственным вызовом команд сопроцессора (ключ N$+). В первом случае программа вообще не использует возможности сопроцессора, даже если он и установлен на машине. Во втором же: при наличии сопроцессора возлагает все вычислительные возможности на него, а если он отсутствует, попытка вызова сопроцессорных команд приводит к генерации основным процессором исключения int 0x7. Его "отлавливает" программный эмулятор сопроцессора – фактически та же самая встроенная библиотека поддержки вычислений с плавающей точкой.

 

Что ж, теперь мы общих чертах представляем себе как происходит передача вещественных аргументов и горим нетерпением увидеть как это происходит "в живую". Для начала возьмем тривиальный пример:

 

#include <stdio.h>

 

float MyFunc(float a, double  b)

{

#if defined(__WATCOMC__)

#pragma aux MyFunc parm [8087];

// Компилить с ключом -7

#endif

return a+b;

}

 

main()

{

printf("%f\n",MyFunc(6.66,7.77));

}

Листинг 78 Демонстрация передачи функции вещественных аргументов

Результат компиляции Microsoft Visual C++ должен выглядеть так:

 

main   proc near           ; CODE XREF: start+AFp




- Начало -  - Назад -  - Вперед -



Книжный магазин