Главная страница
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.017 c
2-1279957179
_guest_
2010-07-24 11:39
2010.10.17
можно ли напрямую использовать сишные файлы h и lib


6-1227179897
Decoding
2008-11-20 14:18
2010.10.17
Indy + Cookie


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


2-1274281038
Vass
2010-05-19 18:57
2010.10.17
Узнать Top предыдущего элемента в списке TList


11-1225479146
Dy1
2008-10-31 21:52
2010.10.17
KOLMediaPlayer