简单介绍
这道题目说真的做的有点久的,不过也很好的可以总结了前面的知识,还是不错的
先看下资料把,资料如下所示
注意:闪烁的效果必须要在全屏的DOS方式下才能看到
编写代码如下
assume cs:codesg,ds:data,ss:stack
data segment
db 'welcome to masm!';设置数据
db 02h,24h,71h ;设置颜色
data ends
stack segment
db 48 dup(0);设置栈段,因为要用到双重循环,所以需要保存cx等数据
stack ends
codesg segment
start:mov ax, data ;将data段地址给ax
mov ds,ax ;将ax给ds
mov ax,0B800H ;将显示缓冲区的开始地址给ax
mov es,ax ;将ax给扩展段ex
mov ax,stack ;将栈段地址给ax
mov ss,ax ;将ax赋值给ss段
mov cx,3 ;第一重循环3次
mov si,10H ;给si的就是data中的偏移地址
mov dx,0B800H ;给dx的显示缓冲区的开始地址,因为下面需要到下一行打印的时候是需要用到的
s:push cx ;将cx先压栈保存
push si ;保存si,下面计算字符属性在data中偏移的时候需要使用
mov cx,16 ;设置第二重循环的cx的值
mov bx,680H ;保存偏移的值也就是让打印的字符显示在屏幕中间需要使用
mov di,0
s1:
mov al,[di] ;将ds:[di]的值给al
mov es:[bx],al ;将al赋值给显示缓冲区当中的低地址的地方
mov ah,ds:[si] ;将字符属性给ah
mov es:[bx+1],ah ;设置字符属性到高地址处
add bx, 2 ;显示缓冲区偏移两个字节,所以让bx+2
add di,1 ;字符数据指向下一个字节
loop s1
mov dx,es ;重新要设置es的值
add dx,0AH ;dx+0AH其实就是想要让es偏移160个字节到下一行
mov es,dx ;dx赋值给es
pop si ;出栈把原先的值给si
inc si ;si指向下一个字符属性的数据也就是data段中的下一个字符属性字节的数据
pop cx ;把cx出栈,下面loop循环将会进行-1
loop s
mov ax,4c00h
int 21h
codesg ends
end star
效果图