先假设某处内存中存在一个字符A,具体显示到显示器的细节是怎么实现的呢
显示卡的设计,是把显示内存中的数据呈现到显示器上。只要往显示内存中写入数据,显示卡硬件就负责呈现,是不需要CPU干预的。显示卡内存本身是RAM,可擦写的,可读可写,在早期的DOS时代,程序(典型如C程序)可以通过直接寻址把需要呈现的数据复制到显示卡内存处,这叫直接写屏,也即自己操纵硬件(汇编和C的特点就是方便这种操作)。但后期的保护式操作系统不再允许应用程序直接向显示卡内存赋值数据了,它把这段内存地址保护起来,所有需要向这个地址读写数据的程序,都必须向操作系统申请,有特权的才允许(亦即只放行显示卡驱动程序),所有应用程序,都必须通过中介层与驱动程序交换数据,委托驱动程序读写显示卡内存。这样间接操作的模式就是:应用程序利用驱动程序的接口读写显示卡数据,并输出。DOS也有这种间接模式,叫中断调用(BIOS中断),但那个时候的汉字系统之类外挂程序,往往是截获中断之后自己向显示卡内存读写,所以后期的天汇之类汉字系统比早期的CCDOS快得多,就是这个道理。间接调用必然是慢的,但现代计算机的硬件比以前高级得多,所以整体看起来比以前直接写屏还快,就不觉得慢了,如果现代Windows系统运行在旧式那种规模的计算机上,图形模式就无法忍受了。
所以,你的这个问题是这样:应用程序在某处内存中有一个字符A,它要显示到显示器上,应用程序通过系统提供的输入输出函数把这个字符通过参数传递给驱动程序,再由驱动程序把数据写到对应的显示卡内存处,结果就出来了。
显示卡历来有两种模式,一种是文本模式,一种是图形模式。文本模式是在显示卡的ROM中固化了文字(英文字母或汉字)的图案,只要告诉显示卡要输出的文字的编码,显示卡就自动从ROM中把字模图案调出来画到显示器上。图形模式是应用程序自己把需要输出的图案画出来,比文本模式慢得多。所以,这里你显示的A以怎样的字型和方式显示出来,是跟模式有关的。
中断,接近于直接操纵硬件(视具体中断而定),所以在现代操作系统中,用旧式的汇编写中断调用,不成功是不奇怪的,因为操作系统极可能不容许你这样做。应该改用API,那就是新式的中断模式。有容有个问题涉及的中断,其实也是这个原因。DOS下TC2.0很多输入输出函数是直接写屏的,在移植到Windows版本之后,这些输入输出函数已经被Windows截获强制改用API了(只是写程序的人自己不知道而已),某些软件再怎么模拟DOS,都不可能百分百跟DOS一样让你直接操纵硬件,此时某些代码无法执行也是很正常的,同样,Windows下的TC输入输出速度大打折扣也是很正常的。
显示卡的设计,是把显示内存中的数据呈现到显示器上。只要往显示内存中写入数据,显示卡硬件就负责呈现,是不需要CPU干预的。显示卡内存本身是RAM,可擦写的,可读可写,在早期的DOS时代,程序(典型如C程序)可以通过直接寻址把需要呈现的数据复制到显示卡内存处,这叫直接写屏,也即自己操纵硬件(汇编和C的特点就是方便这种操作)。但后期的保护式操作系统不再允许应用程序直接向显示卡内存赋值数据了,它把这段内存地址保护起来,所有需要向这个地址读写数据的程序,都必须向操作系统申请,有特权的才允许(亦即只放行显示卡驱动程序),所有应用程序,都必须通过中介层与驱动程序交换数据,委托驱动程序读写显示卡内存。这样间接操作的模式就是:应用程序利用驱动程序的接口读写显示卡数据,并输出。DOS也有这种间接模式,叫中断调用(BIOS中断),但那个时候的汉字系统之类外挂程序,往往是截获中断之后自己向显示卡内存读写,所以后期的天汇之类汉字系统比早期的CCDOS快得多,就是这个道理。间接调用必然是慢的,但现代计算机的硬件比以前高级得多,所以整体看起来比以前直接写屏还快,就不觉得慢了,如果现代Windows系统运行在旧式那种规模的计算机上,图形模式就无法忍受了。
所以,你的这个问题是这样:应用程序在某处内存中有一个字符A,它要显示到显示器上,应用程序通过系统提供的输入输出函数把这个字符通过参数传递给驱动程序,再由驱动程序把数据写到对应的显示卡内存处,结果就出来了。
显示卡历来有两种模式,一种是文本模式,一种是图形模式。文本模式是在显示卡的ROM中固化了文字(英文字母或汉字)的图案,只要告诉显示卡要输出的文字的编码,显示卡就自动从ROM中把字模图案调出来画到显示器上。图形模式是应用程序自己把需要输出的图案画出来,比文本模式慢得多。所以,这里你显示的A以怎样的字型和方式显示出来,是跟模式有关的。
中断,接近于直接操纵硬件(视具体中断而定),所以在现代操作系统中,用旧式的汇编写中断调用,不成功是不奇怪的,因为操作系统极可能不容许你这样做。应该改用API,那就是新式的中断模式。有容有个问题涉及的中断,其实也是这个原因。DOS下TC2.0很多输入输出函数是直接写屏的,在移植到Windows版本之后,这些输入输出函数已经被Windows截获强制改用API了(只是写程序的人自己不知道而已),某些软件再怎么模拟DOS,都不可能百分百跟DOS一样让你直接操纵硬件,此时某些代码无法执行也是很正常的,同样,Windows下的TC输入输出速度大打折扣也是很正常的。
授人以渔,不授人以鱼。