Advertisement
Guest User

Untitled

a guest
May 6th, 2010
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     .model small
  2. .486
  3. .stack 200h
  4. .data
  5.     c       dd  1013904223
  6.     a       dd  1664525
  7.     N       dd   20 ; количество циклов
  8.     M       dd  24; модуль (степень двойки, не больше 31)
  9.     arr     dd 1000 Dup(0) ; создаем  массив
  10.     i       db  0   ; счетчик элементов  массива
  11.    
  12.     seed    dd  ?
  13.     Buff dd 10, 6 dup(0), '$'
  14.     fl db 0
  15.     text     db  'Initial random seed:', 13, 10, '$'
  16.     text_A   db  'A = $'
  17.     text_C   db  'C = $'
  18.     text_M   db  'M = $'
  19.     text_N   db  'N = $'
  20.     text_err db 13, 10, 'Maybe  END or error, please press any key to Quite', 13, 10, '$'
  21.     wringMSG db 'Wrong input, please reinput', 13, 10, '$'
  22.     ask_A    db '    X(n+1) = (a*X(n)+ c) mod m ',13,10,'input a',13,10,'$'
  23.     ask_C    db 13,10,'input c',13,10,'$'
  24.     ask_M    db 13,10,'input m (0..24)',13,10,'$'
  25.     ask_N    db 13,10,'Enter the number of output sequences',13,10,'$' ; количество выводимых результатов
  26. .code
  27. start:
  28.     mov     ax, @data
  29.     mov     ds, ax
  30.     ;*-*-*-*-*-*-*-*-*готовим экран*-*-*-*-*-
  31.     MOV AX,0600H ;AH 06 (прокрутка) ;AL 00 (весь экран)
  32. MOV BH,07 ;Нормальный атрибут (черно/белый)
  33. MOV CX,0000 ;Верхняя левая позиция
  34. MOV DX,184FH ;Нижняя правая позиция
  35. INT 10H ;Передача управления в BIOS
  36.    
  37.  ;*** запрос параметра А ***
  38.     mov     dx, offset ask_A
  39.     mov     ah, 9h
  40.     int     21h  
  41.     call    Input ; распознаем А
  42.     mov A,EAX
  43.    
  44.  ;*** запрос параметра C ***
  45.     mov     dx, offset ask_C
  46.     mov     ah, 9h
  47.     int     21h  
  48.     call    Input ; распознаем С
  49.     mov C,EAX  
  50.    
  51.  ;** запрос параметра N **
  52. m1: mov     dx, offset ask_N
  53.     mov     ah, 9h
  54.     int     21h
  55.     call    Input ; распознаем N
  56.     mov N,EAX
  57.     cmp N,1 ; 1< N <65535 ?
  58.     jb m1
  59.     cmp N,65535
  60.     ja m1
  61.  ;** запрос параметра M **  
  62. m2: mov     dx, offset ask_M
  63.     mov     ah, 9h
  64.     int     21h
  65.     call    Input ; распознаем M
  66.     mov     M,EAX
  67.     cmp     M,1 ; 1< M <24 ?
  68.     jb      m2
  69.     cmp     M,24
  70.     ja      m2 
  71.    
  72. ;**********вывод введенных переменных************************  
  73.     mov     dx, offset text_A    
  74.     mov     ah, 9h              
  75.     int     21h                
  76.     mov EAX,A
  77.     call Print
  78.     ;**********
  79.     mov     dx, offset text_C    
  80.     mov     ah, 9h              
  81.     int     21h                
  82.     mov EAX,C
  83.     call Print
  84.     ;************
  85.     mov     dx, offset text_M    
  86.     mov     ah, 9h              
  87.     int     21h                
  88.     mov     eax, M
  89.     call Print
  90.     ;***********
  91.     mov     dx, offset text_N    
  92.     mov     ah, 9h              
  93.     int     21h                
  94.     mov     eax, N
  95.     call Print
  96.     ;***********   
  97.     mov     dx, offset text
  98.     mov     ah, 9h
  99.     int     21h  
  100. ;**********************************************************************
  101.     ; цыкл N раз
  102.     xor eax,eax ; очистим аккомулятор
  103.     call Randomize ; разогреть генератор
  104.     xor     esi,esi ; загрузить адрес начала массива в esi
  105. main_loop:
  106.     push    cx
  107.     call    Random
  108.     mov     CL,  byte ptr M
  109.     shr     eax, CL ; разделить на 2^M=16777216
  110.     mov     arr[esi*4],eax ; масштабируем индекс массива в соответствии с размером элемента и пхаем в него текущее значение
  111.     call    Print
  112.     inc     esi ; увеличиваем индекс массива
  113.     pop     cx
  114.     dec     n
  115.     add     i,5
  116.     cmp     n,0
  117.     jg     main_loop ;если N=0
  118.     call    Error_Exit; ждем нажатие клавиши для выхода
  119.     mov     ax, 4c00h
  120.     int     21h
  121. ;----------------------------------------------------------------------------------------------------------
  122. ;
  123. ;
  124. ;
  125. ;
  126. Input proc
  127. mov DX, offset Buff ; вводим наше число
  128. mov AH, 10
  129. int 21h
  130.  
  131. mov SI, offset Buff+1   ; адрес где лежит кол-во введенных цифр
  132. xor CX, CX
  133. mov CL, [SI]        ; берем кол-во введенных цифр для цикла
  134. cmp CX, 0       ; если ноль - на выход
  135. je exit_lbl
  136.  
  137. mov fl, 0       ; по умолчанию сбрасываем флаг негативного числа
  138. inc SI          ; берем первый разряд нашего числа
  139. mov AL, [SI]        ; пхаем его в регстр для обработки
  140. cmp AL,'-'      ; если минус - установить флаг
  141. jne positiv
  142. mov fl, 1       ; флаг негативного числа
  143. dec CL          ; кло-во цифр стало на 1 меньше
  144. cmp CX, 0       ; если кроме минуса там ничего нет - на выход
  145. je exit_lbl
  146. inc SI          ; следующий разряд нашего числа
  147.  
  148. positiv:
  149. xor EAX, EAX
  150. xor DI, DI
  151. mov EDI, 10     ; 10 - кратность
  152. dec SI          ; адрес цифры возвращаем обратно
  153.  
  154. lbl1:
  155. inc SI          ; берем следующий разряд нашего числа
  156. xor EBX, EBX
  157. mov BL, [SI]        ; пхаем его в регстр для обработки
  158. sub EBX, '0'        ; обрабатываем его - перобразуем в людской вид
  159. cmp BL, 9       ; если это не цифра - на выход
  160. ja exit_lbl
  161. mul EDI         ; умножаем его на 10
  162. add EAX, EBX        ; складываем до купы
  163. loop lbl1
  164.  
  165. cmp fl,1            ; если у нас отрицательное число
  166. jne ee
  167. neg EAX         ; цепляем ему минус
  168. ee:
  169.  
  170. ret
  171. exit_lbl:
  172. call Error_Exit
  173. Input endp
  174. ;----------------------------------------------------------------------------------------------------------
  175. Randomize proc
  176.     mov     ah, 2ch
  177.     int     21h  ;Теперь CH содержит часы (от 0 до 24)
  178.                  ;CL - минуты (от 0 до 59)
  179.                  ;DH - секунды (от 0 до 59)
  180.                  ;DL - сотые доли секунды (от 0 до 99)
  181.     mov     ax, dx
  182.     shl     eax, 16
  183.     mov     ax, cx
  184.     mov     seed, eax
  185.     ret
  186. Randomize endp
  187. ;----------------------------------------------------------------------------------------------------------
  188. Random proc
  189.     xor     edx, edx
  190.     mov     eax, seed
  191.     mul     a
  192.     add     eax, c
  193.     mov     seed, eax
  194.     ret
  195. Random endp
  196. ;----------------------------------------------------------------------------------------------------------
  197. Print proc
  198.     mov     ebx, 10
  199.     xor     cx,cx
  200.  
  201. print_calc:
  202.     xor     edx, edx
  203.     div     ebx
  204.     push    dx
  205.     inc     cx
  206.     test    eax, eax
  207.     jnz     print_calc
  208.  
  209.     mov     ah, 2h
  210.  
  211. print_out:
  212.     pop     dx
  213.     add     dl, '0'
  214.     int     21h
  215.     dec     cx
  216.     jnz     print_out
  217.  
  218.     mov     dl, 13
  219.     int     21h
  220.     mov     dl, 10
  221.     int     21h
  222.  
  223.     ret
  224. Print endp
  225. ;----------------------------------------------------------------------------------------------------------
  226. Error_Exit proc     ; сообщаем, что все пропало и выходим
  227. mov DX, offset text_err
  228. mov AH, 9
  229. int 21h
  230. ; ждем нажатия любой клавиши
  231. mov AH, 10h
  232. int 16h
  233. ; завершение программы
  234. mov AX, 4C00h
  235. int 21h
  236. ret
  237. Error_Exit endp
  238. ;----------------------------------------------------------------------------------------------------------
  239. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement