Advertisement
Guest User

Untitled

a guest
May 5th, 2010
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;
  2. ; Интервал:     [0..eax-1]                                             ;
  3. ;------------------------------------------------------------------------------;
  4. ; Использование:        call   r_init                                         ;
  5. ;           mov eax,ГРАНИЦА ИНТЕРВАЛА                          ;
  6. ;           call    brandom32                                      ;
  7. ;------------------------------------------------------------------------------;
  8. ; Результат:       число в интервале [0..ГРАНИЦА ИНТЕРВАЛА]               ;
  9. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;
  10.  
  11. ;----[Подпрограмма инициализации генератора случайных чисел]-------------------;
  12.  
  13. r_init:
  14.         push    ebp eax edx     ; Сохраняем в стэке ebp,
  15.                         ; eax, edx
  16.  
  17.         call    __delta1_       ;
  18. __delta1_:  pop ebp         ; Получение дельта смещения
  19.         sub ebp,offset __delta1_    ;
  20.  
  21.         db  0fh,031h        ; Получаем случайное зерно
  22.         mov rand_seed,eax       ;
  23.  
  24.         pop edx eax ebp     ; Восстанавливаем edx,
  25.                         ; eax, ebp
  26.  
  27.         ret             ; Возврат из подпрограммы
  28.  
  29. ;----[Подпрограмма генерации случаного чмсла в диапазоне]----------------------;
  30.  
  31. brandom32:                  ; Эта подпрограмма
  32.                         ; возвращает случайное число
  33.                         ; в диапазоне 0..eax-1
  34.  
  35.         push    edx ecx ebp     ; Сохраняем в стэке edx,
  36.                         ; ecx, ebp
  37.  
  38.         call    __delta2_       ;
  39. __delta2_:  pop ebp         ; Получение дельта смещения
  40.         sub ebp,offset __delta2_    ;
  41.  
  42.         imul    eax,eax,100     ; Умножаем eax на 100
  43.         push    eax         ; и сохраняем eax в стэке
  44.  
  45.         call    random32        ; Вызываем подпрограмму
  46.                         ; генерации случайного числа
  47.         xor edx,edx         ; Обнуляем edx
  48.         pop ecx         ; Восстанавливаем значение
  49.                         ; из стэка в ecx
  50.         div ecx         ; Делим eax на ecx
  51.         xchg    eax,edx         ; Помещаем остаток в eax
  52.         xor edx,edx         ; Обнуляем edx
  53.         push    100         ; Помещаем в ecx - 100
  54.         pop ecx         ;
  55.         div ecx         ; Делим eax на ecx
  56.         pop ebp ecx edx     ; Восстанавливаем ebp, ecx,
  57.                         ; edx
  58.         ret             ; Возврат из подпрограммы
  59.  
  60. ;----[Подпрограмма генерации случайного числа]---------------------------------;
  61.  
  62. random32:
  63.         push    ebp
  64.  
  65.         call   
  66. __delta3_       ;
  67. __delta3_:  pop ebp         ; Получение дельта смещения
  68.         sub ebp,offset __delta3_    ;
  69.  
  70.                 mov     eax,12345678h       ;
  71.         rand_seed= dword ptr $-4    ;
  72.         imul    eax,00019660Dh      ;
  73.         add eax,03C6EF35Fh      ; Математические операции
  74.         mov     [ebp+rand_seed],eax ; для получения случайного
  75.         shr     eax,16          ; числа
  76.         imul    eax,[esp+4]     ;
  77.  
  78.         pop ebp
  79.  
  80.         retn                ; Возврат из подпрограммы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement