Случайный выбор из двух однобайтных чисел.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Asterix, 30 окт 2004.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Subj



    Интересует самый короткий вариант.
     
  2. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Это достаточно быстрый и короткий вариант?

    Многое зависит от того, где эти числа находятся. В данном случае я предполагаю, что они в байтовом массиве.



    .data

    num1 db 1

    num2 db 2



    .code

    rdtsc

    and eax,01h

    add eax,offset num1

    movsx eax,byte ptr [eax]



    поправить здесь можно лишь так:

    rdtsc

    xor al,ah

    and eax,01h

    movsx eax,byte ptr [eax+offset num1]
     
  3. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Код (Text):
    1. ; code
    2.  
    3. randomize:
    4.  
    5.  Push st
    6.  Call [GetLocalTime]
    7.  
    8.  Mov  Eax, [st.wSecond]
    9.  Shl  Eax, 16
    10.  Add  Eax, [st.wMilliseconds]
    11.  Mov  [seed], Eax
    12.  Ret
    13.  
    14. rnd:
    15.  
    16.  Mov  Eax, [seed]
    17.  Mov  Ecx, 69621
    18.  Mul  Ecx
    19.  Mov  Ecx, 0x7fffffff
    20.  Div  Ecx
    21.  Mov  [seed], Edx
    22.  Ret
    23.  
    24.  
    25. choice:
    26.  
    27.  Call rnd
    28.  
    29.  Mov  Edx, [seed]
    30.  And  Edx, 1
    31.  Mov  Eax, [numbers + Edx]
    32.  Ret
    33.  
    34. ; bss
    35.  
    36. seed rd 1
    37.  
    38. numbers:
    39.   rd 1
    40.   rd 2
    41.  
    42.  SYSTEMTIME st


    Вызываешь один раз randomize, а затем choice сколько влезет.



    P.S. Можно первые пять команд из randomize заменить на rdtsc, как в варианте выше. Кстати, про вариант выше. Если выбор пероидический, то при определённой частоте выбора случайность будет утеряна (чисто теоретически).
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Я предполагал передавать числа в ah, al и возвращать там же. Желательно вообще обойтись без операций с памятью.

    Нужно что-то типа

    rol ax, cl

    вот только я торможу как заставить 5 младших бит cl рандомно приходить такими чтоб сдвиг получался кратным 8
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    bh,bl - числа

    результат выбора в bl


    Код (Text):
    1. rdtsc
    2. lea ecx,[eax*8]
    3. ror bx,cl
     
  6. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    bh,bl - числа

    результат выбора в bl



    rdtsc

    shr eax,1

    jc @f

    mov bl,bh

    @@:

    9 байт, против 13 у Black_mirror

    но выполняется медленнее
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Тогда можно 8 байт:



    dec eax

    jpe @f
     
  8. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    А если числа в регистрах EBX,EDX, по можно исп

    rdtsc

    dec eax

    cmovpe ebx,edx

    Результат в EBX, но работает быстрее предыдущих вариантов
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вобщем рандомизатор что-то получился не очень, вот исходник - может кто хочет поэкспериментировать и предложить лучший.



    http://cracklab.ru/f/files/1941166798__KeyGen.rar
     
  10. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Вот блин, глупость написал, а внимания никто не обратил. rdtsc записывает результат в пару регистров EDX:EAХ. Короче надо использовать пару EBX,ECX в коде.