;DispReturn模拟一个回车的显示,(让下一个要显示的字符在下一行的开头处显示),其中edi始终指向要显示的下一个字符的位置。
;
------------------------------------------------------------------------
DispReturn:
push
eax
push ebx
mov eax, edi ;
mov bl, 160 ;
div bl
; eax/bl 执行后al=当前行号
and eax, 0FFh;
只保留行号,列号清0
inc eax ;
eax+=1,使eax为当前行的下一行
mov bl, 160 ;
mul bl
; eax*bl,eax为当前行的下一行的开始
mov edi, eax ;
使edi指向当前行的下一行的开始
pop ebx
pop eax
ret
; DispReturn
结束---------------------------------------------------------
注1: 80*25彩色字模式的显示显存在内存中的地址为B8000h~BFFFH,共32k.向这个地址写入的内容立即显示在屏幕上边.在80*25彩色字模式 下共可以显示25行,每行80字符,每个字符在显存中占两个字节,第一个字节是字符的ASCII码.第二字节是字符的属性,(80字符占160个字节)。
2. test 把两个操作数进行"与"操作,不保存运算结果,只设置标志位,
一般用来测试寄存器是否为空
text eax,eax //来检测eax是否为空
jnz xxxxx //不为空就跳
.1: lodsb ;load a byte from ds:si to al --- I test al, al ;if al =0 then zf changed ,the string is end with 0 意思是循环加载PMMessage直到最后一个字符 jz .2 ;当字符加载完毕,就执行.2 mov [gs:edi], ax add edi, 2 jmp .1 .2: ; 显示完毕
AL和AL相与可以测试AL是否是0,因为他改变了ZF