Генератор случайных чисел - Assembler (247693)
Формулировка задачи:
Разработать программу генератора случайных чисел в сопроцессоре. Случайные числа X изменяются в диапазоне 0..79, Y = 0..25. Используя генератор случайных чисел, заполнить экран дисплея при нажатии клавиши пробел, при Enter экран должен восстанавливаться. Программа должна передавать управление в фоновую программу или MS-DOS при нажатии ESC.
Решение задачи: «Генератор случайных чисел»
textual
Листинг программы
.MODEL Small .STACK 100h .DATA ;константы кодов клавиш kbESC equ 1Bh kbENTER equ 0Dh kbSpace equ 20h ;параметры ГПСЧ Seed dw 0 RandA dw 10001 RandC dw 3 RandM dw 17417 ;сообщение Msg db 'Функции клавиш:', 0Dh, 0Ah db 'ESC - выход из программы,', 0Dh, 0Ah db 'Space (пробел) - вывести символ "*" в случайной позиции экрана,', 0Dh, 0Ah db 'ENTER (ввод) - восстановить экран.', 0Dh, 0Ah db '$' .DATA? ;переменные X dw ? Y dw ? ;буфер экрана ScreenBuffer db 25*80*2 dup(?) .CODE Randomize proc push es push ax mov ax, 40h mov es, ax mov ax, es:[6Ch] mov Seed, ax pop ax pop es ret Randomize endp Random proc push bx push dx push ax mov ax, Seed mov bx, RandA mul bx add ax, RandC adc dx, 0 mov bx, RandM div bx mov ax, dx mov Seed, ax mov dx, 0 pop bx div bx mov ax, dx pop dx pop bx ret Random endp main proc far ; пролог mov ax, @data mov ds, ax ; DS = сегмент .DATA mov es, ax ;********************************************** ;вывод информационного сообщения mov ah, 09h lea dx, [Msg] int 21h ;инициализация ГСПЧ call Randomize ;копирование экрана в буффер push ds mov ax, 0B800h mov ds, ax mov si, 0 lea di, [ScreenBuffer] mov cx, 25*80 rep movsw pop ds ;********************************************** ;программный цикл @@CmdLoop: ;ожидание нажатия клавиши mov ah, 00h int 16h ;если нажата ESC - выйти cmp al, kbESC je @@Break ;если нажат пробел - вывести звёздочку по случайным координатам cmp al, kbSpace je @@YetStar ;если нажат ENTER - восстановить экран cmp al, kbENTER je @@RestoreScreen jmp @@CmdLoop @@YetStar: mov ax, 25 push ax call Random mov [X], ax mov ax, 80 push ax call Random mov [Y], ax mov ax, [X] mov bl, 80 mul bl add ax, [Y] shl ax, 1 mov di, ax push es mov ax, 0B800h mov es, ax mov es:[di],word ptr ('*'+256*5) ;звёздочка фиолетового цвета pop es jmp @@CmdLoop @@RestoreScreen: push es mov ax, 0B800h mov es, ax mov di, 0 lea si, ScreenBuffer mov cx, 25*80 rep movsw pop es jmp @@CmdLoop @@Break: ;********************************************** ;эпилог mov ax,4C00h int 21h ; Выходим из программы main endp END main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д