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 11:10:00) [41]

В данный момент у меня в программе написано просто:

asm
ror Mask1, 4
end;

Это синтаксически правильно? Или все-таки нужно писать все, что мне указал здесь Ученик? И кстати, в том варианте, который написал Ученик, я так понял, есть ошибки? Не мог бы кто-нибудь точно сказать, что за ошибки?

Есть еще один вопрос глупый, но все-таки хотелось бы спросить: мне что, все сразу функции писать (из тех, которые здесь написал ученик) или просто нужно выбрать одну из них для своего типа переменных?

Спасибо!


Anatoly Podgoretsky   (2002-11-02 09:07:00) [42]

Dr_Mike © (01.11.02 10:28)
Хороший вопрос, ответ от незнания автором данной библиотеки Дельфи, к тому же непоследовательносять, в одних есть, а в других нет.

У него есть и вторая незначительная ошибка - ключевое слово Assembler лишнее. И так еще по мелочам.


apay   (2002-11-02 01:03:00) [43]

Я вообще не пойму, зачем нужны:
MOV Result, EAX
MOV EAX, <Param1>

при передаче пар-ров типа Byte, Word, Integer, Pointer ...
если не указано stdcall или что то подобное,
первый пар-р в EAX(AX или AL) , второй в EDX, третий в ECX, остальные ч/з стек.
Result берется из EAX (AX, AL), иногда EDX:EAX


Dr_Mike   (2002-11-02 00:25:00) [44]

А точно через стек ???


han_malign   (2002-11-01 11:59:00) [45]

Извиняюсь int64 в функцию передается через стек поэтому
function _SHRD(const Value: int64; const Count: byte): int64; assembler;
asm
MOV CL,AL//Count
MOV EAX,DWORD PTR([Value])
MOV EDX,DWORD PTR([Value+4])
SHRD EAX,EDX,CL
SHR EDX,CL
end;
function _SHLD(const Value: int64; const Count: byte): int64; assembler;
asm
MOV CL,AL//Count
MOV EAX,DWORD PTR([Value])
MOV EDX,DWORD PTR([Value+4])
SHLD EDX,EAX,CL
SHL EAX,CL
end;


han_malign   (2002-11-01 10:48:00) [46]

Кстати MOV Result, AL(AX,EAX) совсем не нужен потому что фактичечески Result это тоже AL(AX,EAX,EAX:EDX)


Ученик   (2002-11-01 10:46:00) [47]

>Dr_Mike © (01.11.02 10:28)
Хороший вопрос, видимо, разные люди писали :-)


han_malign   (2002-11-01 10:41:00) [48]

function _shl(Operand : word; Count: byte): WORD;
asm
push CX //возможно не нужно - непомню
mov CL,Count
shl AX,DX
pop CX //возможно не нужно - непомню
end;

для други типов
function _shl(Operand : Dword; Count: byte): DWORD;
asm
push CX //возможно не нужно - непомню
mov CL,Count
shl EAX,CL
pop CX //возможно не нужно - непомню
end;
function _shl(Operand : byte; Count: byte): byte;
asm
push CX //возможно не нужно - непомню
mov CL,Count
shl AL,CL
pop CX //возможно не нужно - непомню
end;

аналогично
RCx - циклический через флаг переноса
ROx - циклический через флаг переполнения
SAx - арифметический(не трогается знаковый бит)
SHx - сдвиг
SHxD- сдвигает превый операнд с присоединенным вторым
function _SHxD(Operand: int64;Count: byte):int64;
asm
push CX //возможно не нужно - непомню
mov CL,Count
SHxD EAX,EDX,CL
pop CX //возможно не нужно - непомню
end;

где x - L или R
короче
http://webster.cs.ucr.edu/Page_TechDocs/Doc386
или найди TechHelp(еще досовский справочник)

З.Ы. в Паскале целочисленные аргументы впихиваются в аккумуляторы (пару EAX:EDX)если помещаются, аналогично Result - тоже соответствует этой регистровой паре, поэтому приведенные примеры полностью функциональны.


Dr_Mike   (2002-11-01 10:28:00) [49]

А почему все функции завершаются именно так "MOV Result, AL(AX,EAX)" ???


Ученик   (2002-11-01 10:20:00) [50]

{ Project JEDI Code Library (JCL) }
//------------------------------------------------------------------------------

type
TBitRange = Byte;

function LRot(const Value: Byte; const Count: TBitRange): Byte; assembler;
asm
MOV CL, Count
ROL AL, CL
end;

//------------------------------------------------------------------------------

function LRot(const Value: Word; const Count: TBitRange): Word; assembler;
asm
MOV CL, Count
ROL AX, CL
end;

//------------------------------------------------------------------------------

function LRot(const Value: Integer; const Count: TBitRange): Integer; assembler;
asm
MOV CL, Count
ROL EAX, CL
end;

//------------------------------------------------------------------------------

function RRot(const Value: Byte; const Count: TBitRange): Byte; assembler;
asm
MOV CL, Count
MOV AL, Value
ROR AL, CL
MOV Result, AL
end;

//------------------------------------------------------------------------------

function RRot(const Value: Word; const Count: TBitRange): Word; assembler;
asm
MOV CL, Count
MOV AX, Value
ROR AX, CL
MOV Result, AX
end;

//------------------------------------------------------------------------------

function RRot(const Value: Integer; const Count: TBitRange): Integer; assembler;
asm
MOV CL, Count
MOV EAX, Value
ROR EAX, CL
MOV Result, EAX
end;


Alx2   (2002-11-01 10:18:00) [51]

>DelphiDummy (01.11.02 10:13)
asm
ror (или rol) variable <то, в чем сдвигаем>, 3 // - то на что сдвигаем
end;


DelphiDummy   (2002-11-01 10:13:00) [52]

Дело в том, что я не знаю ассемблера вообще. То есть, приблизительно я представляю, как прикрутить ассемблерную вставку к своей программе, но то, что будет написано внутри asm ... end, я все равно объснить не смогу.

А насчет второго варианта я не совсем понял: во-первых, там где-нибудь должны стоять скобки или нет? Во-вторых, что это за цифра такая -- 80000000? Что она означает в данном случае?

Спасибо!


Anatoly Podgoretsky   (2002-10-31 23:16:00) [53]

если без использования АСМ то иожно так (для 32 бит)
if N and 1 <> 0 then N shr 1 or $80000000 else N shr 1
if N and $80000000 <> 0 then N shl 1 or 1 else N shl 1


Ученик   (2002-10-31 23:00:00) [54]

Поддерживается встроенный ассемблер
asm
...
end


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

Наверх

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