Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.045 c
2-1132275620
Pop
2005-11-18 04:00
2005.12.11
Как узнать размер TPopupMenu ?


14-1132632979
Separator
2005-11-22 07:16
2005.12.11
Закрытые и перенесеные посты


4-1128418629
NightLord
2005-10-04 13:37
2005.12.11
InternetExplorer


3-1130403953
Zhekson
2005-10-27 13:05
2005.12.11
(Сохранение базы)Invalid File Name


2-1132501867
Frozzen
2005-11-20 18:51
2005.12.11
Ошибка при работе с dll!