Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > функция,собирающая битовый массив в число


Автор: PrettyGirl 2.5.2007, 14:48
в реализации 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.
может кто-ниб объяснит этот кусок кода? и как устранить ошибку?
Заранее спасибо!

Автор: Kuvaldis 2.5.2007, 15:14
компилятору не очень понятен размер сравниваемых участков памяти. Т.е. нужен префикс размерности
Код

next:            cmp       BYTE PTR  [esi], 0

Автор: PrettyGirl 2.5.2007, 15:27
почему-то не помогает....
по-прежнему та же ошибка: 
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.

Автор: sgi1981 2.5.2007, 15:36
Цитата

next:            cmp        [esi],0

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

mov        cl,8

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

Автор: PrettyGirl 2.5.2007, 15:39
и как это исправить? 
подскажите пожалуйста? 
в асме не очень разбираюсь...

Добавлено через 7 минут и 52 секунды
заменила строку: mov        cl,8 на строку               mov        cx,8
все та же ошибка....

Автор: dumb 2.5.2007, 16:41
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
    }


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

Добавлено через 2 минуты и 42 секунды
не могли бы вы подсказать,как реализовать эту функцию на С++?

Автор: PrettyGirl 2.5.2007, 18:02
а вот ещё одна функция...в ней тоже проблемы возникли...
Код

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
    }
}

подскажите пожалуйста,как её исправить?

Автор: ksnk 2.5.2007, 18:50
Код

    _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
    }

Автор: PrettyGirl 2.5.2007, 19:12
stosb ошибка в этой строке

Добавлено через 30 секунд
всмысле,с памятью

Автор: ksnk 2.5.2007, 19:15
Проверь, там вместо esi должны edi использоваться...

Автор: dumb 2.5.2007, 19:18
убери ненужные 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
    }

Автор: fish9370 9.5.2007, 10:51
простите, а поправку на ASCII, в последнем примере разве не надо делать?

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

не простим. smile
прекрасная девушка так и не описала конкретный вид данных. а судя по setc(заметьте, не я это предложил(с) smile) получается, что строка таки не ASCII, а 01 00 00 01...

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