Не могу понять смысл кода

Тема в разделе "WASM.BEGINNERS", создана пользователем blueboar, 31 авг 2009.

  1. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Что делает нижеприведенный код? Я понимаю только, что он 999 раз в цикле что-то повторяет. В стеке - некоторое число.

    Код (Text):
    1. 0040EA4D    8B4C2404    MOV ECX, [ESP+ARG_0]
    2. 0040EA51    8BC1        MOV EAX, ECX
    3.  
    4. 0040EA53    BAE7030000  MOV EDX, 03E7       ;999 раз
    5. 0040EA58    56      PUSH ESI
    6. 0040EA59    0FB7F0      MOVZX ESI, AX
    7. 0040EA5C    69F669900000    IMUL ESI, 9069
    8. 0040EA62    C1E810      SHR EAX, 10
    9. 0040EA65    03C6        ADD EAX, ESI
    10. 0040EA67    0FB7F1      MOVZX ESI, CX
    11. 0040EA6A    69F650460000    IMUL ESI, 4650
    12. 0040EA70    C1E910      SHR ECX, 10
    13. 0040EA73    03CE        ADD ECX, ESI
    14.  
    15. 0040EA75    4A      DEC EDX
    16. 0040EA76    75E1        JNZ 0040EA59        ;Делать 999 раз
    17.  
    18. 0040EA78    890D20AE4500    MOV [0045AE20], ECX
    19. 0040EA7E    A324AE4500  MOV [0045AE24], EAX
    20.  
    21. 0040AE83    5E      POP ESI
    22. 0040AE84    C3      RET
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    int a = b = ARG_0;
    for ( int i = 0; i < 999; ++ i ) {
    a = ( a << 10 ) + ( a & 0xFFFF ) * 9069;
    b = ( b << 10 ) + ( b & 0xFFFF ) * 4650;
    }

    Похоже на хеширование... Хотя кто его знает... По обрывку ничего и не скажешь...
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Forever
    int a = b = ARG_0;
    for ( int i = 0; i < 999; ++ i ) {
    a = ( a << 16 ) + ( a & 0xFFFF ) * 9069;
    b = ( b << 16 ) + ( b & 0xFFFF ) * 4650;
    }
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    и 0х9069, 0х4650
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    скорее на random
     
  6. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Странный рандом с 2-мя выходными, да еще и статическими переменными.
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    рандом обязательно с глобальными переменными. Только это не рандом. Это скорее, randomize. С неким стартовым значением. Для "перемешивания"... хотя какое еще перемешивание, для псевдослучайных величин...
     
  8. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    может long int random
     
  9. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Самопальный рандом же, нет ничего обязательного..

    Может и long int, в любом случае не поймешь, пока не увидишь вызывающего кода %)
     
  10. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    всмысле long long :)
     
  11. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    да да)
     
  12. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Если более конкретно - это исполняемый файл языка q (http://kx.com/Developers/software/windows.zip - там его можно утянуть).

    В подпрограмму (я так понял - подпрограмму записи новой переменной) передается два параметра - значение (строка -314159) и тип (одной буквой - число в виде строки). Далее число читается, переводится в EAX (целое). А затем выполняется данная подпрограмма - я думал она должна 314159 перевести в 3.14159 (число PI). Хотя этот код мало похож на данное действо.

    Еще были мысли что это такое умножение - когда вместо деление, когда вместо деления выполняется умножение+сдвиг. Тогда непонятно зачем 999 раз
     
  13. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    max7C4
    Пардон. Я решил, раз числа без префиксов и постфиксов значит в десятичной системе.
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    На какой-то извратский CRC32 похоже...
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Forever
    достаточно было взглянуть на второй столбец шестнадцатеричных цифр, являющихся кодами команд и увидеть в конце команд те же самые цифры, что и в дизассемблерном коде.
    blueboar
    сложно сказать, разве что этот язык использует свой формат чисел с плавающей точкой
     
  16. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    > На какой-то извратский CRC32 похоже...
    В CRC32 было бы обращение в таблцице в двордами, либо работа с полиномом и обычно там not eax в конце.
     
  17. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    dendi
    Откуда такие суеверия? CRC разные бывают. А таблица - всего лишь деталь реализации, если не знаешь. Можно тупо посчитать циклом, только это считается менее эффективным.
     
  18. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Спасибо всем отвечавшим, проблема решена. Это оказался SEED - начальное значение для Random. Да и тип (который одной буквой) был S - Seed. А число -314159 - ну понравилось видимо ребятам число PI для SEED'а.
     
  19. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    Ustus, конечно не знаю, поэтому и пишу. Пост основан на том что с виду это ниразу не CRC.