Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция,собирающая битовый массив в число 
:(
    Опции темы
PrettyGirl
Дата 2.5.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в реализации DES'а понадобилась функция, собирающая битовый массив в число. Откопала вот такую: 
Код

yte    StrToByte(byte *buf) 
{    byte b;
    _asm {
        push    cx
        push    ax
        push    esi
        mov        esi,buf
        mov        cl,8
        xor        ax,ax
        or        ah,128    //inc ah
next:            cmp        [esi],0
        je        zero
        or        al,ah
zero:            shr        ah,1    //shl
        inc        esi
        loop    next
        mov        b,al
        pop        esi
        pop        ax
        pop        cx
    }
    return b;
}

но почему-то ошибка с памятью вот в этой строке:
next:            cmp        [esi],0
не очень знакома с асмом. Вообще задание написать Des на Builder.
может кто-ниб объяснит этот кусок кода? и как устранить ошибку?
Заранее спасибо!
PM MAIL   Вверх
Kuvaldis
Дата 2.5.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



компилятору не очень понятен размер сравниваемых участков памяти. Т.е. нужен префикс размерности
Код

next:            cmp       BYTE PTR  [esi], 0



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
PrettyGirl
Дата 2.5.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



почему-то не помогает....
по-прежнему та же ошибка: 
Project Project1.exe raised exeption class EAccessViolation with message 'access violation at adress A04011A1. Read of adress 00133000'. Process stop. Use step or run to continue.
PM MAIL   Вверх
sgi1981
Дата 2.5.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

next:            cmp        [esi],0

next:            cmp byte ptr [esi],0
указание компилятору размера операнда в памяти
Цитата

mov        cl,8

mov cx,8
старшая половина регистра cx - регистр ch может быть не равен 0, и это станет причиной выхода за предел допустимого максимального индекса массива.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
PrettyGirl
Дата 2.5.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



и как это исправить? 
подскажите пожалуйста? 
в асме не очень разбираюсь...

Добавлено через 7 минут и 52 секунды
заменила строку: mov        cl,8 на строку               mov        cx,8
все та же ошибка....
PM MAIL   Вверх
dumb
Дата 2.5.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



1. если строка обычная("01101.."), то сравнивать надо было с '0'
2. такая "оптимизация" даст только проигрыш(причем ощутимый) в скорости обработки, по сравнению с обычным кодом на C++ и нормальным(да и даже средним) оптимизирующим компилятором.
3. в сети куча исходников des'а на любых языках, написанных со знанием дела...

ps. ну а если цель сугубо учебная, то вот исправленный вариант этого кода:
Код

    _asm {
        push    esi
        mov     esi,buf
        mov     ecx,8
        xor     eax,eax
        cld
next:   lodsb
        and     al,1
        shl     ah,1
        or      ah,al
        loop    next
        mov     b,ah
        pop     esi
    }


PM MAIL   Вверх
PrettyGirl
Дата 2.5.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Добавлено через 2 минуты и 42 секунды
не могли бы вы подсказать,как реализовать эту функцию на С++?
PM MAIL   Вверх
PrettyGirl
Дата 2.5.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а вот ещё одна функция...в ней тоже проблемы возникли...
Код

void    ByteToStr(byte b,byte *buf)
{
    _asm {
        push    cx
        push    ax
        push    esi
        mov        esi,buf
        mov        al,b
        mov        cl,8
next:    shl        al,1        // shr
        setc    [esi]
        inc        esi
        loop    next
        pop        esi
        pop        ax
        pop        cx
    }
}

подскажите пожалуйста,как её исправить?
PM MAIL   Вверх
ksnk
Дата 2.5.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Код

    _asm {
        push    cx
        push    ax
        push    edi
        mov        edi,buf
        mov        ah,b
        mov        cl,8
        cld
next:    shl        ah,1        // shr
        mov        al,'0'
        adc         al,0
        stosb
        loop    next
        Xor     ax,ax  // 0-terminating
        stosb   
        pop        edi
        pop        ax
        pop        cx
    }


Это сообщение отредактировал(а) ksnk - 2.5.2007, 18:53


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
PrettyGirl
Дата 2.5.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



stosb ошибка в этой строке

Добавлено через 30 секунд
всмысле,с памятью
PM MAIL   Вверх
ksnk
Дата 2.5.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Проверь, там вместо esi должны edi использоваться...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
dumb
Дата 2.5.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



убери ненужные push/pop ax,cx (push/pop esi, вообще говоря, тоже не нужны...)
и mov ecx,8

ps.
Код

    _asm { // использование esi билдер засечет и сам сделает push/pop
        mov     esi,buf
        mov     ecx,8 // !!!
        mov     al,b
next:   shl     al,1
        setc    [esi]
        inc     esi
        loop    next
    }

PM MAIL   Вверх
fish9370
Дата 9.5.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



простите, а поправку на ASCII, в последнем примере разве не надо делать?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
dumb
Дата 9.5.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(fish9370 @  9.5.2007,  10:51 Найти цитируемый пост)
простите

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

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

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


 




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


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

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