多操作一下就行了。可能不是最简。
平常我们是用debug单步调试的,但是想看到整体的颜色变化
就要直接在dosbox中直接运行了。
代码:
assume cs:codesg,ds:datasg,ss:color
datasg segment
db 'welcome to masm!'
datasg ends
color segment
dw 0,130,36,57 ;闪一闪
color ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov ax,0B878H
;直接在dosbox中运行本程序
;0B80a 第一行
;0B80a+a(十进制为10)=0B814 第二行
;13行为中间行,即第一行加12行 C*A=78 B80a+78=B882
;第一行为0a只能加多23行即E6到第24行,使es=B8F0
;能加24行到第25行,成为B8Fa但是运行完后从
;本程序返回到dosbox程序会显示在25行所以看起来是没有效果
;在dosbox中运行debug再运行本程序
;0B8e6 倒数5行
;B828 开头
;B8aa 中间
;B8f0 结尾
;要显示三个字符串在中间 所以在12、13、14行显示
;12行B882-a=B878
mov es,ax
mov si,0
mov di,64 ;显示在水平方向上的中间80/2-8个字符=32
;32*2=64
mov ax,color
mov ss,ax
mov sp,1
pop ax ;改变颜色
mov cx,3
s0: push cx ;外循环 颜色栈与循环栈合在一起用了
mov cx,16
;内循环开始
s1: mov al,ds:[si] ;改变字符
mov es:[di],ax ;写入显存
inc si
add di,2
loop s1 ;内循环结束
pop cx ;外循环
mov si,0 ;重新赋值
mov di,64
pop ax ;从栈中取出新的颜色
mov bx,es ;修改要修改的显示的行数
add bx,10
mov es,bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
