Главная страница
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.035 c
14-1132487859
_Sergey_
2005-11-20 14:57
2005.12.11
Заочная олимпиада (г. Омск 2005 год)


2-1133118762
Flea
2005-11-27 22:12
2005.12.11
горячая клавиша на ctrl+апостроф


14-1132074231
Неудачник
2005-11-15 20:03
2005.12.11
ПИШУ КУРСОВОЙ! ПОМОГИТЕ! ОСТАЛОСЬ 20 дней!


9-1121833769
Andry
2005-07-20 08:29
2005.12.11
Как улучшить модель


4-1128520529
Profik
2005-10-05 17:55
2005.12.11
MailSlot