Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Delphi+Assembler (xor)


Автор: takep 16.6.2008, 16:03
function encrypt(str:string; len,key:dword):string;assembler;
asm
pushad  ;сохранение регистров на всякий случай
mov ecx,len ;в счётчик цикла пихаем длину строки
mov ebx,key ;в рандомный другой регист пихаем ключ шифрования
lea esi,[str] ; прописываем в esi адрес первого симовла строки
lea edi,[result] ;в edi адрес переменной результата
@cyc:
lodsd  ; в EAX идет очередной символ из ebx; SI++
xor eax,ebx ; smile 
stosd ; в резалт пишем аккумулятр
loop @cyc
popad  ;воссатавливаем зачения регистров
end;

вся соль в том, что оно не пишет в result. в чем ошибки?
(функция ксорит посимвольно строку по ключу)

Автор: W4FhLF 16.6.2008, 16:35
Цитата(takep @  16.6.2008,  16:03 Найти цитируемый пост)
вся соль в том, что оно не пишет в result. в чем ошибки?


Код

stosd ; в резалт пишем аккумулятр
loop @cyc
popad ;воссатавливаем зачения регистров


Он пишет, но ты переписываешь smile в pushad/popad нет никакого смысла в данной функции. А lodsd/stosd + loop достаточно медленные, поэтому твоя реализация на ассемблере будет медленнее обычного цикла(если функция писалась на асме с целью оптимизации по скорости).

Автор: takep 16.6.2008, 16:51
я сначала без пушада делал, всеравно нифига. не в нем дело. и что, получается, комманда асемблера медленнее чем делфи?

Автор: W4FhLF 16.6.2008, 17:11
Ну запихни то, что тебе надо явно:

Код

mov result,eax


Цитата(takep @  16.6.2008,  16:51 Найти цитируемый пост)
и что, получается, комманда асемблера медленнее чем делфи?


Делфи компилирует программы в точно такой же ассемблер, а иногда они получаются даже быстрее собственноручно написанного ассемблере кода, ибо компилятор знает о процессоре немало(хотя в случае делфи маловато) smile 

Автор: ama_kid 8.7.2008, 20:57
Цитата(takep @  16.6.2008,  16:03 Найти цитируемый пост)
вся соль в том, что оно не пишет в result. в чем ошибки?
не знаю, насколько актуально (все-таки полмесяца прошло  smile ), но самая главная ошибка - имхо в том, что под result не выделяется память. Ну и по мелочи всякого... Немного доделал\переделал твой пример и малость прокомментировал:
Код
function encrypt(ParamS:string;key:byte):string;assembler;
asm
 push EDI
 push ESI
 push EBX

 push edx       // сохраняем параметр key
 lea esi,[eax]  // загрузили первый параметр
 push esi       // сохраняем адрес первого параметра

 mov ESI,result  // выделяем память под результат
 mov EBX,[EAX-4] // размер для выделения памяти берем такой же как и исходная строка
 call System.@NewAnsiString
 mov EDI,EAX
 mov [ESI],EDI

 mov [EDI-4],ebx // Формируем размер строки результата
 mov ecx,ebx     // В цикле счетчик идет по длине строки
 pop esi         // Возвращаем сохраненное значение указателя на исходную строку
 pop ebx         // возвращаем key

@@cyc:           // Собственно цикл самой операции xor'а
 lodsb
 xor al,bl
 stosb
 loop @@cyc

 pop EBX
 pop ESI
 pop EDI
end;
Параметр len в принципе не нужен, ибо строка хранит информацию о своей длине, поэтому мы можем её получить...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)