Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.003 c
2-1280119066
Spot
2010-07-26 08:37
2010.10.17
Ошибка в Locate


8-1206912479
Незнайка
2008-03-31 01:27
2010.10.17
склеивание изображения


15-1279448920
SD Software
2010-07-18 14:28
2010.10.17
Как в Windows 7 получить адрес не экспортируемой функции


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский