Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi+Assembler (xor) 
:(
    Опции темы
takep
Дата 16.6.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.8.2007

Репутация: нет
Всего: нет



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. в чем ошибки?
(функция ксорит посимвольно строку по ключу)
PM MAIL   Вверх
W4FhLF
Дата 16.6.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



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


Код

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


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



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
takep
Дата 16.6.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.8.2007

Репутация: нет
Всего: нет



я сначала без пушада делал, всеравно нифига. не в нем дело. и что, получается, комманда асемблера медленнее чем делфи?
PM MAIL   Вверх
W4FhLF
Дата 16.6.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Ну запихни то, что тебе надо явно:

Код

mov result,eax


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


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


Это сообщение отредактировал(а) W4FhLF - 16.6.2008, 17:11


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ama_kid
Дата 8.7.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: нет
Всего: 95



Цитата(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 в принципе не нужен, ибо строка хранит информацию о своей длине, поэтому мы можем её получить...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1102 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.