Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Циклический сдвиг вправо и влево [D5, Win2k, WinXP]


Страницы:   1 2 3

DelphiDummy ©   (2002-10-31 22:31:00) 

Мастера! Подскажите, пожалуйста, есть ли в Delphi операция циклического сдвига вправо и влево? В Builder`е этим занимаются функции _lrotr и _lrotl. А есть ли что-либо подобное и в Delphi?

И еще: если такой функции все же нет, то не подскажет ли кто-нибудь, как с помощью стандартных функций Delphi написать функцию циклического сдвига?

Заранее всем ответившим большое спасибо!


DelphiDummy   (2002-11-02 14:15:00) [21]

down (02.11.02 14:03)

> Range checking - проверка на выход за границы массива. Выход за
> границы массива иногда (в лучшем случае) вызывает AV => может
> помочь

Честно говоря, я вообще не понимаю, о чем Вы говорите. К моему большому сожалению, я не умею пользоваться debugger`ом. :(

Как же мне все-таки понять, что за ошибка у меня в программе? :(


down   (2002-11-02 14:03:00) [22]

Range checking - проверка на выход за границы массива. Выход за границы массива иногда (в лучшем случае) вызывает AV => может помочь


DelphiDummy   (2002-11-02 13:56:00) [23]

down (02.11.02 13:48)

> Range checking включено?

Извините, конечно, но что такое range checking?


down   (2002-11-02 13:48:00) [24]

Range checking включено?


DelphiDummy   (2002-11-02 13:45:00) [25]

Кстати, на сайте готовых решений, ссылка на который есть на этом сайте, я нашел такую функцию в одной из программ:

function ROTATE_LEFT(x, n: UINT4): UINT4;
begin
Result := (((x) shl (n)) or ((x) shr (32-(n))));
end;


Разве это не решение? Это ли не функция циклического сдвига? Или эта функция и те, которые были здесь приведены на asm -- это две разные вещи?


DelphiDummy   (2002-11-02 13:43:00) [26]

Anatoly Podgoretsky (02.11.02 13:38)

Ну, так Вы мне не поможете найти эту ошибку? Программа на Delphi не очень большая... Просто я уже запарился ее искать. Не знаю, где там и что у меня не инициализировано, потому что я переписывал программу в точности с работающей программы, написанной на Builder`е. Почему на Builder`е она работает, а на Delphi нет, я не знаю.


Anatoly Podgoretsky   (2002-11-02 13:38:00) [27]

Так у тебя ощибка не зжесь, а в другом месте, согласно сообщение у тебя гдето обращение не к иничиализированному или чужому адресу, самое вероятное где то неинициализированный или испорченный указатель. Ошибки такого рода иногда очень трудно найти, правильнее не делать ошибок.


DelphiDummy   (2002-11-02 13:34:00) [28]

down (02.11.02 13:27)

> Дебуггер не помогает?

Нет, не помогает. Может быть, ты можешь помочь? Если есть время, конечно...


down   (2002-11-02 13:27:00) [29]

Дебуггер не помогает?


DelphiDummy   (2002-11-02 13:25:00) [30]

Anatoly Podgoretsky (02.11.02 13:15)

OK! Рассказываю все с самого начала. Есть задача: реализовать алгоритм блочного шифрования ГОСТ-28147-89 в Delphi. Кто знаком с этим алгоритмом, тот знает, что там используется функция циклического сдвига.

Более того, у меня уже есть абсолютно точно работающая программа, написанная на Builder`е. Задача облегчается: теперь надо просто переписать эту программу на Delphi. Я переписал, запустил -- не работает. Все проверки всех полей работают, но как только нажимаешь на кнопку шифрования, выдается ошибка Access violation at address 0044AF17 in module "lab2.exe". Read of address 005EC2F8. Так как я понятия не имею, что точно не работает, то подумал, что дело в функции циклического сдвига.

Я вставил код, представленный Вами, Анатолий, все опять же запускается, но ошибка не исчезает. В связи с этим вопрос: не могли бы Вы мне помочь разобраться с этим делом? Я мог бы прислать по почте уже работающую программу на Builder`е и прислать свой вариант на Delphi. Быть может, для мастера не составит труда найти ошибку. Может быть, я вообще не там ищу, и ошибка-то вот она, но я ее не вижу. Если можно так сделать, напишите, пожалуйста, здесь об этом. Заранее спасибо!

to All: Народ! Кто-нибудь еще может мне помочь с переписыванием программы на Builder`е под Delphi? Кто знаком с алгоритмами шифрования и, в частности, с алгоритмом ГОСТ-28147-89?


Anatoly Podgoretsky   (2002-11-02 13:15:00) [31]

Не надо сообщать, это работает много лет, начиная с Д2, для Д1 немного по другому
С интегер сложнее, размер у него задается компилятором и неоднократно менялся, да и смысла делать циклический сдвиг для знаковых как то непонятен


DelphiDummy   (2002-11-02 13:11:00) [32]

Anatoly Podgoretsky (02.11.02 12:57)

А для типа Integer пишется так же, как и для LongWord? Сейчас попробую вставить указанное Вами в мою программу. О результатах сообщу дополнительно.


Anatoly Podgoretsky   (2002-11-02 13:10:00) [33]

Не надо, это их право так писать, сделай им снисхождение, не все же грамотные, тем более что страшного ничего нет, рабочий код в обоих случаях


down   (2002-11-02 13:05:00) [34]

Anatoly Podgoretsky © (02.11.02 12:57)
ok, передам разработчикам Indy


Anatoly Podgoretsky   (2002-11-02 12:57:00) [35]

down (02.11.02 12:23)
Это пишется так:


function ROL(val: LongWord; shift: Byte): LongWord;
asm
mov cl, dl;
rol eax, cl;
end;

function ROR(val: LongWord; shift: Byte): LongWord;
asm
mov cl, dl;
ror eax, cl;
end;


Для Д3 LongWord заменяется на Longint


down   (2002-11-02 12:23:00) [36]

а, извини, невимательно прочитал
может быть, это поможет (из idglobal.pas, не знаю, есть ли в D5)function ROL(val: LongWord; shift: Byte): LongWord; assembler;
asm
mov eax, val;
mov cl, shift;
rol eax, cl;
end;

function ROR(val: LongWord; shift: Byte): LongWord; assembler;
asm
mov eax, val;
mov cl, shift;
ror eax, cl;
end;


DelphiDummy   (2002-11-02 12:13:00) [37]

Кстати, господа! На все ваши варианты компилятор Delphi 5.5 ругается, что inline assembler error или что-то в этом роде. Короче говоря, ошибка внутреннего ассемблера. В help"е написано, что встроенный компилятор ассемблера увидел ошибку в ассемблерной вставке в моей программе. И ругань эта идет и на вариант от пользователя Ученик, и на вариант от пользователя han_malign.

Вопрос: неужели никто не может подсказать реальноработающую функцию циклического сдвига? Чтобы было еще понятнее и дабы сократить размеры ответов, напишу, что есть переменная-маска Mask1 типа Integer, которую надо сместить вправо сначала на четыре бита, потом еще на четыре, а потом вернуть влево на 11 бит. Исходя из этого никто не может мне писать ассемблерную вставку в программу, реальнопозволяющую осуществить то, что я написал?

Спасибо!


DelphiDummy   (2002-11-02 12:09:00) [38]

Нда... Ну, спасибо, down, за бесполезный совет. Повторюсь: мне нужен не побитовыйсдвиг, а именно циклический. Разница, надеюсь, понятна?


down   (2002-11-02 12:06:00) [39]

пиши просто X := Y shr {или shl} Z


DelphiDummy   (2002-11-02 11:29:00) [40]

Уважаемый han_malign! Я ничего не понял из того, что Вы написали. По ссылке, которую Вы мне дали, я не нашел ничего, кроме кучи html-файлов. Загрузил один из них и получил длинный список, в котором я ничего не понял. Вот одна из строчек в этом списке:

D0 /0 ROL r/m8,1 3/7 Rotate 8 bits r/m byte left once

Что такое D0? Что такое /0? Что такое r? Что такое m8?.. В общем, что такое это все?

А если я в программе написал просто rol Mask1, 4 или ror Mask1, 4 -- это разве не циклический сдвиг вправо и влево?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо