Главная страница
    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
6-1227179897
Decoding
2008-11-20 14:18
2010.10.17
Indy + Cookie


11-1224939346
Neep
2008-10-25 16:55
2010.10.17
Исчезают колонки в ListView при создании без родителя


2-1280119066
Spot
2010-07-26 08:37
2010.10.17
Ошибка в Locate


2-1279611355
beginner
2010-07-20 11:35
2010.10.17
Как разернуть окно на весь экран?


15-1279113348
Кто б сомневался
2010-07-14 17:15
2010.10.17
Какой идиот придумал писать букву u перед pas модулями?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский