Loading

汇编语言实现字母下落效果

使用汇编语言实现流星雨效果

具体要求:程序模拟一组流星飞向地面的情景。地面使用多行#表示,流星使用大写字母表示。程序产生一组流星,(比如10个),从屏幕顶部下降飞向地面。一组流星中,每个流星的字符颜色随机,一个流星下落只能去掉一个#号,当最后一行地面有#被去掉时,程序终止。

代码实现,首先使用较为原始的编译工具,dasm.exe和link.exe,通过命令行来对程序编译,这些需要在win 32位环境下运行,新系统已不支持。老版编译工具不好找,作者上传一份备用。下载地址

下载之后,使用命令行,进入文件夹中,boot.asm中为源代码,可以修改。改好之后,调用编译,链接命令

mash boot.asm
link boot.obj

link之后输入程序名字,其他直接回车,就可以生成exe文件,观看执行效果。

64位环境下,可以使用masm2015,编译运行就可以了。使用免费功能就可以了,没有提供断点执行工程,读取内存也费力,付费只能多看软件自带的示例代码,用处不大。兼容64位环境还是不错的

##根据上面的题目,汇编语言需要实现各部分代码,现在介绍各部分代码功能实现

随机数子程序

rand  proc ;随机数子程序

      push cx
      PUSH DX
      PUSH AX
      STI
      MOV AH,0             ;读时钟计数器值
      INT 1AH
      MOV AX,DX            ;清高6位
      AND AH,3
      MOV DH,49
      MOV DL,39           ;除39,产生0~38余数
      DIV DL
      MOV BL,AH            ;余数存BX,作随机数
      POP AX
      POP DX
      POP CX
      RET
rand  endp

通过读取,当前时钟的数值,取余数,实现随机数生成的操作

清屏子程序:

clear_screen proc near    ;清屏子程序
    ;add ----------------    
    MOV AX, OFFSET ground  ; 将字符串拷贝到ax  
    MOV BP, AX          ; es:bp = 串地址  
    MOV CX, OFFSET strend                
    MOV DX, OFFSET ground  
    SUB CX, DX          ; cl= 串长度   
    MOV leng, CX  
    MOV AX, 1301H 
    MOV CX, 40
    MOV DX, 1700H 
    MOV BH, 00H
    MOV BL, colorg
    INT 10H
    ;-----------------
     push ax              ;保护寄存器
     push bx
     push cx
     push dx
     mov ah,7             ;屏幕上卷功能
     mov al,1
     mov ch,0             ;左上角行号
     mov cl,0             ;左上角列号
     mov dh,150           ;右下角行号
     mov dl,200           ;右下角列号
     mov bh,2             ;卷入行属性
     int 10h              ;调用显示功能
     pop dx               ;恢复寄存器
     pop cx
     pop bx
     pop ax
     ret                  ;返回主程序
clear_screen endp

调用系统的清屏功能,现有显示字符向上移动,实现清屏的操作。使用寄存器设置相关清屏的参数,int 10h调用

延时子程序

dly_qrtr proc near         ;延时子程序
     push cx
     push dx
     mov dx,50000
 d11:mov cx,8000
 d12:loop d12
     dec dx
     jnz d11
     pop dx
     pop cx
     ret
dly_qrtr endp

最常见的延时操作,通过循环执行空指令来实现延时的效果。这里需要注意下64位和32位系统区别,字长度不一样,所以字节溢出的时间不同。简单来讲,32位是50000,  64位的话设置为500,就可以了

最后实现最开始的题目要求,就是,显示随机字符,清屏 ,延时,循环操作就可以实现相关功能了。效果图如下

 

 

如果需要源码,可以从下面的链接下载   源码

posted @ 2018-08-18 20:51  CodeMonkey404  阅读(581)  评论(0编辑  收藏  举报