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


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


Синтаксис ассемблера скрывает эти различия, позволяя программисту абстрагироваться от тонкостей реализации (а еще говорят, что ассемблер – язык низкого уровня), и мало кто знает, что FADD [float] и FADD [double] это разные машинные инструкции с опкодами 0xD8 ??000??? и 0xDC ??000??? соответственно. Плохая новость, помет Тигры! Анализ дизассемблерного листинга не дает никакой информации о вещественных типах – для получения этой информации приходится спускаться на машинный уровень, вгрызаясь в шестнадцатеричные дампы инструкций.

В таблице 10 приведены опкоды основных команд сопроцессора, работающих с памятью. Обратите внимание, что с вещественными значениями типа long double непосредственные математические операции невозможны – прежде их необходимо загрузить в стек сопроцессора.

 

Команда

Тип

короткий (float)

длинный (double)

расширенный (long double)

FLD

0xD9 ??000???

0xDD ??000???

0xDB ??101???

FSTP

0xD9 ??011???

0xDD ??011???

0xDB ??111???

FST

0xD9 ??010???

0xDD ??010???

нет

FADD

0xD8 ??000???

0xDC ??000???

нет

FADDP

0xDE ??000???

0xDA ??000???

нет

FSUB

0xD8 ??100???

0xDC ??100???

нет

FDIV

0xD8 ??110???

0xDC ??110???

нет

FMUL

0xD* ??001???

0xDC ??001???

нет

FCOM

0xD8 ??010???

0xDC ??010???

нет

FCOMP

0xD8 ??011???

0xDC ??011???

нет

 

Таблица 10 Опкоды основных команд сопроцессора. Второй байт опкода представлен в двоичном виде. Знак вопроса обозначает любой бит.

 

Замечание о вещественных типах языка Turbo Pascal. Вещественные типы языка Си вследствие его машиноориентированности совпадают с вещественными типами сопроцессора, что логично. Основной же вещественный тип Turbo Pascal-я, - Real, занимает 6 байт и противоестественен для машины. Поэтому, при вычислениях через сопроцессор он программно переводится в Extended тип (long double в терминах Си). Это "съедает" львиную долю производительности, но других типов встроенная математическая библиотека, призванная заменить собой сопроцессор, увы - не поддерживает.


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