Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .486
- .stack 200h
- .data
- c dd 1013904223
- a dd 1664525
- N dd 20 ; количество циклов
- M dd 24; модуль (степень двойки, не больше 31)
- arr dd 1000 Dup(0) ; создаем массив
- i db 0 ; счетчик элементов массива
- seed dd ?
- Buff dd 10, 6 dup(0), '$'
- fl db 0
- text db 'Initial random seed:', 13, 10, '$'
- text_A db 'A = $'
- text_C db 'C = $'
- text_M db 'M = $'
- text_N db 'N = $'
- text_err db 13, 10, 'Maybe END or error, please press any key to Quite', 13, 10, '$'
- wringMSG db 'Wrong input, please reinput', 13, 10, '$'
- ask_A db ' X(n+1) = (a*X(n)+ c) mod m ',13,10,'input a',13,10,'$'
- ask_C db 13,10,'input c',13,10,'$'
- ask_M db 13,10,'input m (0..24)',13,10,'$'
- ask_N db 13,10,'Enter the number of output sequences',13,10,'$' ; количество выводимых результатов
- .code
- start:
- mov ax, @data
- mov ds, ax
- ;*-*-*-*-*-*-*-*-*готовим экран*-*-*-*-*-
- MOV AX,0600H ;AH 06 (прокрутка) ;AL 00 (весь экран)
- MOV BH,07 ;Нормальный атрибут (черно/белый)
- MOV CX,0000 ;Верхняя левая позиция
- MOV DX,184FH ;Нижняя правая позиция
- INT 10H ;Передача управления в BIOS
- ;*** запрос параметра А ***
- mov dx, offset ask_A
- mov ah, 9h
- int 21h
- call Input ; распознаем А
- mov A,EAX
- ;*** запрос параметра C ***
- mov dx, offset ask_C
- mov ah, 9h
- int 21h
- call Input ; распознаем С
- mov C,EAX
- ;** запрос параметра N **
- m1: mov dx, offset ask_N
- mov ah, 9h
- int 21h
- call Input ; распознаем N
- mov N,EAX
- cmp N,1 ; 1< N <65535 ?
- jb m1
- cmp N,65535
- ja m1
- ;** запрос параметра M **
- m2: mov dx, offset ask_M
- mov ah, 9h
- int 21h
- call Input ; распознаем M
- mov M,EAX
- cmp M,1 ; 1< M <24 ?
- jb m2
- cmp M,24
- ja m2
- ;**********вывод введенных переменных************************
- mov dx, offset text_A
- mov ah, 9h
- int 21h
- mov EAX,A
- call Print
- ;**********
- mov dx, offset text_C
- mov ah, 9h
- int 21h
- mov EAX,C
- call Print
- ;************
- mov dx, offset text_M
- mov ah, 9h
- int 21h
- mov eax, M
- call Print
- ;***********
- mov dx, offset text_N
- mov ah, 9h
- int 21h
- mov eax, N
- call Print
- ;***********
- mov dx, offset text
- mov ah, 9h
- int 21h
- ;**********************************************************************
- ; цыкл N раз
- xor eax,eax ; очистим аккомулятор
- call Randomize ; разогреть генератор
- xor esi,esi ; загрузить адрес начала массива в esi
- main_loop:
- push cx
- call Random
- mov CL, byte ptr M
- shr eax, CL ; разделить на 2^M=16777216
- mov arr[esi*4],eax ; масштабируем индекс массива в соответствии с размером элемента и пхаем в него текущее значение
- call Print
- inc esi ; увеличиваем индекс массива
- pop cx
- dec n
- add i,5
- cmp n,0
- jg main_loop ;если N=0
- call Error_Exit; ждем нажатие клавиши для выхода
- mov ax, 4c00h
- int 21h
- ;----------------------------------------------------------------------------------------------------------
- ;
- ;
- ;
- ;
- Input proc
- mov DX, offset Buff ; вводим наше число
- mov AH, 10
- int 21h
- mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
- xor CX, CX
- mov CL, [SI] ; берем кол-во введенных цифр для цикла
- cmp CX, 0 ; если ноль - на выход
- je exit_lbl
- mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
- inc SI ; берем первый разряд нашего числа
- mov AL, [SI] ; пхаем его в регстр для обработки
- cmp AL,'-' ; если минус - установить флаг
- jne positiv
- mov fl, 1 ; флаг негативного числа
- dec CL ; кло-во цифр стало на 1 меньше
- cmp CX, 0 ; если кроме минуса там ничего нет - на выход
- je exit_lbl
- inc SI ; следующий разряд нашего числа
- positiv:
- xor EAX, EAX
- xor DI, DI
- mov EDI, 10 ; 10 - кратность
- dec SI ; адрес цифры возвращаем обратно
- lbl1:
- inc SI ; берем следующий разряд нашего числа
- xor EBX, EBX
- mov BL, [SI] ; пхаем его в регстр для обработки
- sub EBX, '0' ; обрабатываем его - перобразуем в людской вид
- cmp BL, 9 ; если это не цифра - на выход
- ja exit_lbl
- mul EDI ; умножаем его на 10
- add EAX, EBX ; складываем до купы
- loop lbl1
- cmp fl,1 ; если у нас отрицательное число
- jne ee
- neg EAX ; цепляем ему минус
- ee:
- ret
- exit_lbl:
- call Error_Exit
- Input endp
- ;----------------------------------------------------------------------------------------------------------
- Randomize proc
- mov ah, 2ch
- int 21h ;Теперь CH содержит часы (от 0 до 24)
- ;CL - минуты (от 0 до 59)
- ;DH - секунды (от 0 до 59)
- ;DL - сотые доли секунды (от 0 до 99)
- mov ax, dx
- shl eax, 16
- mov ax, cx
- mov seed, eax
- ret
- Randomize endp
- ;----------------------------------------------------------------------------------------------------------
- Random proc
- xor edx, edx
- mov eax, seed
- mul a
- add eax, c
- mov seed, eax
- ret
- Random endp
- ;----------------------------------------------------------------------------------------------------------
- Print proc
- mov ebx, 10
- xor cx,cx
- print_calc:
- xor edx, edx
- div ebx
- push dx
- inc cx
- test eax, eax
- jnz print_calc
- mov ah, 2h
- print_out:
- pop dx
- add dl, '0'
- int 21h
- dec cx
- jnz print_out
- mov dl, 13
- int 21h
- mov dl, 10
- int 21h
- ret
- Print endp
- ;----------------------------------------------------------------------------------------------------------
- Error_Exit proc ; сообщаем, что все пропало и выходим
- mov DX, offset text_err
- mov AH, 9
- int 21h
- ; ждем нажатия любой клавиши
- mov AH, 10h
- int 16h
- ; завершение программы
- mov AX, 4C00h
- int 21h
- ret
- Error_Exit endp
- ;----------------------------------------------------------------------------------------------------------
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement