Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.17;
Скачать: CL | DM;

Вниз

asm to pascal   Найти похожие ветки 

 
Я   (2010-07-13 18:09) [0]

Здравствуйте. Помогите перевести функцию с асма в паскаль. Я тут вроде чета напереводил, но сомневаюсь


function shr_int32 (i, shift: longint): longint;
begin

asm
 mov eax ,dword ptr [i ]
 mov ecx ,dword ptr [shift ]
 sar eax ,cl
 mov dword ptr [result ] ,eax

end;

end;

function shr_int32 (i, shift: longint): longint;
begin
result:=i shr shift
end;



заранее спасибо


 
Sapersky   (2010-07-13 18:50) [1]

sar - арифметический сдвиг, с учётом знака, т.е. отрицательные корректно сдвигает, а дельфийский оператор shr компилируется всегда в беззнаковый сдвиг.
Можно заменить вызов shr_int32 на div [степень двойки], скомпилируется именно в sar. Правда, компилятор ещё зачем-то добавляет к sar условный джамп, что не прибавляет скорости, но зато не будет лишнего вызова функции.


 
Я   (2010-07-13 19:52) [2]

Чесно говоря не очень вкурил :(

Будет ли этот код равнозначен исходному? Скорость пока опустим

function shr_int32 (i, shift: longint): longint;
begin
result:=i div (shift*32);
end;


 
Германн ©   (2010-07-13 20:08) [3]

А причем тут 32?


 
Димка На   (2010-07-13 20:10) [4]

result:=i;
while shift >0 do
begin
result :=result div 2;
dec(shift)
end;


 
Я   (2010-07-13 20:18) [5]

ааа понял. Спасибо ;)


 
Германн ©   (2010-07-13 20:22) [6]


> ааа понял.

Тогда сделай то же самое, но без цикла. А то некрасиво выглядит. :)


 
Sha ©   (2010-07-13 20:24) [7]

> Я   (13.07.10 19:52) [2]

Не равносилен.

Знак переменной i известен или может быть любой?


 
Я   (2010-07-13 20:58) [8]


> Германн ©   (13.07.10 20:22) [6]
> > ааа понял.Тогда сделай то же самое, но без цикла. А то
> некрасиво выглядит. :)


где-то так думаю ;)

result:=i div (1 shl shift);


 
Sha ©   (2010-07-13 21:01) [9]

> Sapersky   (13.07.10 18:50) [1]
> компилятор ещё зачем-то добавляет к sar условный джамп

Там еще добавляется бит переноса.
Нужно для правильного деления отрицательных чисел.
Иначе было б, например, -1 div 2 = -1


 
Sha ©   (2010-07-13 21:04) [10]

> Я   (13.07.10 20:58) [8]

Очень медленно.


 
Я   (2010-07-13 21:10) [11]

не, ну если возведение в степень вынести за функцию то скорость будет как у исходной


 
Sha ©   (2010-07-13 21:16) [12]

> Я   (13.07.10 21:10) [11]
> не, ну если возведение в степень вынести за функцию то скорость будет как у исходной

не, ну работает неверно же :)


 
Я   (2010-07-13 21:22) [13]


> Sha ©   (13.07.10 21:16) [12]
>не, ну  работает неверно же :)


Тоесть? Можете пояснить?


 
Sha ©   (2010-07-13 21:23) [14]

> Я   (13.07.10 21:10) [11]

На [7] ответь.


 
Я   (2010-07-13 21:25) [15]

значение в переменной i может быть и как положительное так и отрицательное


 
Я   (2010-07-13 21:30) [16]

гы и правда неверно. При $ffffffff в исходной получается -1 во всех остальных 0


 
Sha ©   (2010-07-13 21:32) [17]

> Я   (13.07.10 21:22) [13]

для i:=-25; shift:=2;
результат -7
а у тебя -6


 
Sha ©   (2010-07-13 21:33) [18]

Вот так попробуй   j:=int64(i) shr shift;


 
Я   (2010-07-13 21:57) [19]

Да так работает корректно. Но скорость выросла почти на треть.

было 375-390 при 100000000 итераций, стало 500

Но думаю пойдет. Спасибо. ;0)


 
Я   (2010-07-13 22:04) [20]


> Но скорость выросла почти на треть.

упала тоесть


 
Sha ©   (2010-07-13 22:09) [21]

Если важна скорость, можно проверить такое

 k:=(i and MaxInt) shr shift - (i and (not MaxInt)) shr shift;

или такое

function sar32(i, shift: longint): longint;
asm
 mov ecx, edx
 sar eax, cl
 end;


 
Я   (2010-07-13 22:44) [22]

да уж, фигово не уметь оперировать битами ;(

Остановлюсь на этом
k:=(i and MaxInt) shr shift - (i and (not MaxInt)) shr shift;
asm мне не пойдет, fpc сопротивляется

~265 при 100000000 итераций

попытаюсь понять что вы здесь напрогали ;)

спасибо


 
Sha ©   (2010-07-14 15:12) [23]

Еще надо иметь в виду, что на IA-32 вариант [22] выдает результат,
совпадающий с оригинальной функцией, для любого значения shift,
а вариант [18] - только для shift=0..31


 
Sha ©   (2010-07-14 20:20) [24]

> Я   (13.07.10 22:44) [22]
> попытаюсь понять что вы здесь напрогали ;)

Пояснения здесь:
http://guildalfa.ru/alsha/node/9



Страницы: 1 вся ветка

Текущий архив: 2010.10.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
2-1279809904
AlexDn
2010-07-22 18:45
2010.10.17
Положение MessageDlgPos


15-1279120336
xayam
2010-07-14 19:12
2010.10.17
Изучаем Java


11-1225708523
blackman2003
2008-11-03 13:35
2010.10.17
Меню на второй форме - потеря фокуса главного меню


9-1186710531
AlexanderMS
2007-08-10 05:48
2010.10.17
Проверить, принадлежит ли точка прямоугольнику


15-1279201889
antsa
2010-07-15 17:51
2010.10.17
Мышь в cmd