Генератор случайных чисел - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы