【问题标题】:8086 Assembly Language Creating a Matrix Screensaver8086 汇编语言创建矩阵屏幕保护程序
【发布时间】:2015-01-23 01:03:05
【问题描述】:

我必须创建一个矩阵屏幕保护程序的简单实现,就像电影中的那些,在汇编中,只使用视频内存(文本)。除了用于获取随机字符的随机数生成器之外,我已经布置了大部分结构,但我希望能帮助我缩小其中一些程序及其实现的范围。

我必须使用类似这样的代码:

;Matrix
;This program displays a matrix wallpaper
.model small
.386
.stack 100h
.data

.code
main proc

    mov ax, 0b800h
    mov es, ax

    mov bx, 39  ; row
    mov cx, 12  ; colum

    mov ax, 160
    mul cx
    shl bx,1
    add bx, ax

    mov al, 'A'
    mov ah, 0ah
    mov es:[bx], ax

    mov ax, 4c00h
    int 21h

main endp
end main

但这是我目前所拥有的:

;Matrix
;This program creates a matrix wallpaper
.model small
.386
.stack 100h
.data

speed dword 2147483647
X dw, ?
Y dw, ?
ch dw, ?
att dw, ?

.code
main proc
    mov ax, @data
    mov ds, ax

    ; setup interrupt

    push ds
    mov ax, @code
    mov ds, ax
    mov ah, 25h
    mov al, 9
    mov dx, offset My_int
    int 21h
    pop ds

    ; matrix program, makes the rain effect

Loo2:
    ; for(y = 23; y > 0; y--)
    L1:
        ; for(x = 0; x <= 79; x++)
        L2:
            ; SgetCh(x, y, ch, attribute)
            call SgetCh
            ; SputCh(x, y, ch, attribute)
            call SgetCh
            ; BusyWait
            call BusyWait

    jmp Loo2    

    mov ax, 4c00h
    int 21h
main endp
;***************
My_int proc
    ;cli            ; diable interrupts
    ;mov ax, mystack    ; reset SS
    ;mov ss, ax
    ;mov sp, 100h       ; reset SP
    ;sti            ; reenable interrupt

    mov ax, 4c00h
    int 21h
    iret
My_int endp
;***************
BusyWait proc

    ret
BusyWait endp
;***************
SgetCh proc

    ret
SgetCh endp
;***************
SputCh proc

    ret
SputCh endp
;***************
end main

【问题讨论】:

    标签: assembly matrix procedure screensaver


    【解决方案1】:

    当您从键盘中断处理程序中终止程序时,您期望会发生什么?它肯定不会恢复中断向量!

    由于屏幕上的所有绘图都是在主程序中完成的,因此您无需更改任何中断。只要 BIOS 函数“读取键盘状态”(将在 jmp Loo2 处插入)返回 ZF=0

    ,就退出程序

    这几行

     mov bx, 39  ; row
     mov cx, 12  ; colum
    

    不要对应下面的代码。您混淆了列和行的含义。

    【讨论】:

      【解决方案2】:

      这是我很久以前写的代码。也许你可以使用它:

      mov ax, 19
      int 10h ; 320x200 with 256 colors
      mov ax, 0a000h
      mov es, ax ;set the di segment to the graphics memory
      xor bl, bl ;bl will be used to store the number of the picture
      new:
      inc bl
      hlt ;here the processor will wait (very shortly and in an unregular period)
      xor cx, cx
      xor dx, dx ;cx and dx represent the coordinates
      xor di, di ;set di to offset of the begin of the screen.
      a:
      mov al, cl
      xor al, dl
      add al, dl
      add al, bl ;create a color
      stosb ;write pixel
      inc cx
      cmp cx, 320 ;refresh coordinates
      jne a
      xor cx, cx
      inc dx
      cmp dx, 200
      jne a
      mov ah, 1 ;check whether a key had been pressed
      int 16h
      jz new ;If no key had been pressed, show next picture
      mov ax, 3
      int 10h
      mov ax, 4c00h
      int 21h
      

      【讨论】:

      • 这是一个很好的答案,但我不能使用 dram 的图形部分。我必须'mov ax,0b800h'和'mov es,ax'。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2022-11-25
      相关资源
      最近更新 更多