assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
data ends
stack segment
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
;该代码主要是把data的字符串弄上显示缓冲区里,写在中间,要三行,还要不同颜色之类的
start:mov ax,data
mov ds,ax
mov ax,0B800h ;显示缓冲区25*80
mov es,ax
mov ax,stack
mov ss,ax
mov sp,14
mov bp,06e0h ;屏幕中间三行首行地址,bp负责对三行字符进行逐行使用
mov cx,3 ;三行的循环次数
;压入第三行的属性白底蓝色
mov ax,71h
push ax
;压入第二行的属性绿地红色
mov ax,24h
push ax
mov ax,02h ;第一行需要的属性绿色数据
s0:push cx ;.....压入不解释
push ax ;压入
mov si,0 ;si对显示缓冲区使用
mov bx,0 ;bx对数据区那串字符使用
mov cx,16
pop ax
mov ah,al ;ah存储字符属性
s:
mov al,[bx]
mov es:[bp+si+64],al ;显示器中间偏左开始写
mov es:[bp+si+65],ah
inc bx
add si,2
loop s
pop cx
pop ax ;这个有点难解释,我也琢磨了很长时间,就是必须让cx排在第二位以至于让可以使S0循环下去
add bp,160 ;所以先pop出来,让cx在so处push进去,再push ax,具体看程序心算一下流程,或者画个栈图
loop s0
MOV AH,1 ;这段上网查到的,exe第一次看得到,第二次一闪而过,又是什么非使用中,所以就百度了下。
INT 21H
mov ax,4c00h
int 21h
code ends
end start
开始栈图如下:
第一行属性
---------
cx
---------
第二行属性
---------
第三行属性
----------
之后的自己对着这个图想,想不明白就画
PS:ah的用法是临时想到的,因为本来想push al的,结果发现只能push十六位存储器,杯具啊= = |