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


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


Современным исследователям программ без значения команд сопроцессора очень трудно обойтись.

Сопроцессоры 80x87 поддерживают три вещественных типа данных: короткий 32-битный, длинный 64-битный и расширенный

80-битный, соответствующие следующим типам языка Си: float, double и long double. {>>> сноска Внимание: Стандарт ANSI С не оговаривает точного представления указанных выше типов и это утверждение справедливо только для платформы PC, да и то не для всех реализаций}

 

тип

размер

диапазон значений

предпочтительные типы передачи

float

4 байта

10-38...10+38

регистры CPU, стек CPU, стек FPU

double

8 байт

10-308...10+308

регистры CPU, стек CPU, стек FPU

long double

10 байт

10-4932...10+4932

стек CPU, стек FPU

real[3]

6 байт

2.9*10-39...1.7*10+38

регистры CPU, стек CPU, стек FPU

Таблица 8 Основная информация о вещественных типах сопроцессоров 80x87

 

Аргументы типа float и double могут быть переданы функции тремя различными способами: через регистры общего назначения основного процессора, через стек основного процессора и через стек сопроцессора. Аргументы типа long double потребовали бы для своей передачи слишком много регистров общего назначения, поэтому, в подавляющем большинстве случаев они заталкиваются в стек основного процессора или сопроцессора.

Первые два способа передачи нам уже знакомы, а вот третий – это что-то новенькое! Сопроцессор 80x87 имеет восемь восьмидесятибитных регистров, обозначаемых ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6) и ST(7), организованных в форме кольцевого стека. Это обозначает, что большинство команд сопроцессора не оперируют номерами регистров, а в качестве приемника (источника) используют вершину стека. Например, чтобы сложить два вещественных числа сначала необходимо затолкнуть их в стек сопроцессора, а затем вызывать команду сложения, суммирующую два числа, лежащих на вершине стека, и возвращающую результат свой работы опять-таки через стек.


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