DATAS SEGMENT
db 'AaabbbcccH' ;要显示的字符串,10
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov sp,128
mov ax,0b872h ;算出屏幕第12行中间的显存的段起始位置放入ax中
mov es,ax ;此时es为屏幕第12行中间的显存的段起始位置
mov si,0 ;si用来索引代码列的字符
mov di,0 ;di用来定位目标列
mov cx,10 ;字符串长度
s1:
mov al,ds:[si] ;源字符
mov es:[di],al ;显示目标字符体
mov al,75h ;颜色
mov es:[di+1],al;设置目标字符颜色
inc si ;db 一个字符一个字节
add di,2 ;显存 一个字符两个字节:偶字符体,奇字符颜色
loop s1
MOV AH,4CH
INT 21H
CODES ENDS
END START
在emu8086中运行如下;
此程序并未调用汇编 int 10h功能;INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序;
也未调用 int 21h,ah = 02 子功能,其功能是显示输出,要输出的字符放在dl寄存器中;见此;
https://blog.csdn.net/bcbobo21cn/article/details/108892802
使用的方法是直接写显示缓存;把字符直接写到显示缓存位置,就在屏幕上输出了;
在内存地址空间中,B8000H - BFFFFH 共32kB的空间,为80*25彩色字符模式的显示缓冲区;
显示缓冲区分为8页;每页4KB,4000B;一般情况下,显示第0页内容,B8000H - B8F9FH的4000个字节;
直接写显示缓存我记得是DOS时代重要的技术;目前Win系统还存在否不了解;原理应该是存在的;
原程序见此;
https://blog.csdn.net/larger5/article/details/80617601
在仿真内存顶部输入 b872:0000;如下;看到被显示字符被写入此处;