Guest User

Untitled

a guest
Aug 8th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .586
  2. .MODEL FLAT, STDCALL
  3. .STACK
  4. .DATA
  5. .CODE
  6.  
  7. UnitsDistr PROTO STDCALL Units:DWORD, Numbers:DWORD, NumbersRan:DWORD, Xmin:DWORD
  8. IntsDistr PROTO STDCALL Units:DWORD, UnitsRan:DWORD, Ints:DWORD, IntsResult:DWORD, IntsRan:DWORD, Xmax:DWORD
  9.  
  10. ; Распределение по единичным интервалам.
  11. UnitsDistr PROC USES eax ebx ecx esi edi Units:DWORD, Numbers:DWORD, NumbersRan:DWORD, Xmin:DWORD
  12.     mov esi, Numbers
  13.     mov edi, Units
  14.     mov ebx, Xmin
  15.     mov ecx, NumbersRan
  16.  
  17. Process:
  18.     dec ecx
  19.  
  20.     mov eax, [esi+ecx*4] ; Взять очередное случайное число.
  21.     sub eax, ebx ; Получаем индекс единичного отрезка.
  22.     inc dword ptr [edi+eax*4]
  23.  
  24.     cmp ecx, 0
  25.     jne Process
  26.  
  27.     ret
  28. UnitsDistr ENDP
  29.  
  30. ; Распределение по заданным интервалам.
  31. IntsDistr PROC USES eax ebx ecx edx esi edi Units:DWORD, UnitsRan:DWORD, Ints:DWORD, IntsResult:DWORD, IntsRan:DWORD, Xmax:DWORD
  32.     LOCAL CurrentUnit :DWORD
  33.     LOCAL CurrentInterval :DWORD
  34.  
  35.     ; Начинаем с максимального единичного интервала.
  36.     mov eax, Xmax
  37.     mov CurrentUnit, eax
  38.  
  39.     ; Определение счетчиков. Отсчет начинается с конца.
  40. UnitsCounter equ esi
  41. IntsCounter equ edi
  42. IntsBase equ ebx
  43. UnitsBase equ edx
  44.  
  45.     mov UnitsCounter, UnitsRan
  46.     dec UnitsCounter
  47.     mov IntsCounter, IntsRan
  48.     mov IntsBase, Ints
  49.     mov UnitsBase, Units
  50.  
  51. CheckInterval:
  52.     dec IntsCounter
  53.  
  54.     ; Проверка выхода за пределы интервалов.
  55.     cmp IntsCounter, -1
  56.     je Exit
  57.  
  58.     ; Получение очередного интервала.
  59.     push dword ptr [IntsBase + IntsCounter*4]
  60.     pop CurrentInterval
  61.  
  62. CheckUnit:
  63.    ; Сравнение текущих интервалов.
  64.    mov eax, CurrentUnit
  65.    cmp eax, CurrentInterval
  66.    jl CheckInterval
  67.  
  68.    ; Получение количества элементов единичного интервала.
  69.    mov ecx, dword ptr [UnitsBase + UnitsCounter*4]
  70.    mov eax, IntsResult
  71.    add dword ptr [eax + IntsCounter*4], ecx
  72.  
  73.    ; Переход к следующему единичному интервалу.
  74.    dec CurrentUnit
  75.    dec UnitsCounter
  76.    jmp CheckUnit
  77.  
  78. Exit:
  79.     ret
  80. IntsDistr ENDP
  81.  
  82. END
Add Comment
Please, Sign In to add comment