Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизASM Найти похожие ветки
← →
WondeRu © (2005-11-22 10:33) [0]Есть две просьбы:
1. Предложите способ преобразования Byte в Double на асм.
2. Предложите быстрый способ преобразования массива Byte в массив Double на асм.
Заранее спасибо!
← →
КаПиБаРа © (2005-11-22 10:37) [1]Хэш таблица
← →
WondeRu © (2005-11-22 10:53) [2]попробую... пасиб...
← →
Digitman © (2005-11-22 10:58) [3]function ByteToDouble(Value: Byte): Double;
asm
sub esp, 4
mov [esp], eax
fild [esp]
add esp, 4
end;
← →
Digitman © (2005-11-22 11:00) [4]
> 2. Предложите быстрый способ преобразования массива Byte
> в массив Double на асм
см. MMX
← →
WondeRu © (2005-11-22 11:13) [5]Digitman © (22.11.05 10:58) [3]
mov [esp], eax
mov [esp], al - думаю правильнее
объясните пожалуйста сие действия, если не сложно, так как делфи при таких преобрахованиях вставляет еще и fstp
← →
Digitman © (2005-11-22 11:42) [6]
> mov [esp], al - думаю правильнее
нет, не правильнее
во-первых, компилятор не пропустит такую конструкцию из-за несоответствия типов - придется byte ptr [esp] указывать явно
во-вторых, FILD-инструкция не допускает операнд размером в байт: только слово, двойное слово или квадрослово.
function ByteToDouble(Value: Byte): Double;
asm
//факт.параметр ф-ции передан в регистре eax
//компилятор перед вызовом ф-ции уже позаботился об обнулении eax перед тем как в мл.байт этого регистра пометить передаваемый факт.параметр
//резервируем дв.слово в стеке под лок.переменную
sub esp, 4
//копируем содержимое eax в память, выделенную выше под врем.переменную
mov [esp], eax
//грузим на вершину FPU-стека значение из врем.переменной
//при загрузке FPU сам позаботится об автоматической конверсии
//загружаемого ц/ч значения в формат числа с п/з
fild [esp] //push
//балансируем стек - "удаляем" лок.переменную
add esp, 4
end;
компилятор , видя что ф-ция возвращает в кач-ве результата значение в формате с п/з, подразумевает, что это значение находится на вершине FPU-стека, поэтому и генерирует код получения результата ф-ции в виде инструкции fstp, которая сохраняет значение с вершины FPU-стека в переменную соотв.размера в памяти и балансирует после этого FPU-стек (pop)
← →
Pazitron_Brain © (2005-11-22 11:43) [7]Нужно изобрести преобразователь.
← →
Digitman © (2005-11-22 11:51) [8]
> Pazitron_Brain © (22.11.05 11:43) [7]
ты колы-двойки-то свои исправил, "преобразовальщик" ?)
← →
WondeRu © (2005-11-22 14:11) [9]Digitman © (22.11.05 11:42) [6]
спасибо за подробное объяснение
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.043 c