第二节 工作环境
一、系统空间
IBM PC的记忆区定址,是采用倒装方式 (Big Endian) ,即定址值系由大到小,不同于一般由小而大(Little Endian) 的定址常识。
不论当初如此设计的目的何在,这种与人的习惯相反的观念,给写作组合语言者带来极大的困扰。不仅初学者常莫明其妙,连我个人多年来一直与图形处理为伍,都感到汗颜。每次在处理图形时,一定要将原图画在纸上,对照参详,才能瞭解是怎么回事。
举例说,有个图形值在AX中,要写进 DI 所指记忆区位置中,写完以后,AX要向右移一位再继续写,直到CX=0。
这是一个非常简单,而且经常用到的动作,可是在使用「倒装定址」时,麻烦就来了。
假设AX值为4567H ,DI指向记忆区2000H ,倒装的放法,是先将AL的值放进2000H 的记忆单位中,再将AH放进2001H 的记忆单位里。如果从由小到大的定址观点来看,这就等于是在2000H 中放了一个十六位元的值6745H 。
这倒不打紧,因为再从记忆位址2000H 中放回 AX 时,仍然成为4567H 。问题是在作图时,一旦4567H 变成了6745H ,图形就左右颠倒了。补救的方法,是在放进记忆区之前,先将AH及AL交换,放完以后,再重新交换回来。说来不算大事,可是白白浪费了两个指令的时间及空间。对速度极关紧要的画图显示而言,要画几万个点,所累积的时间就不可小观了。
除此之外,在写程式时,对图形的效应要能掌握,才会有良好的成果,像这样每次转来转去,头都昏了,自然而然就失去了耐性。
现在,80386 CPU 问世了,且不谈效果,读者可以试想,把32位元的 12345678H转换成 78563412H要多少道手续?
这种痛苦的手续,也是美国人不愿意用组合语言的理由之一。在高阶语言中,有编译器代劳,问题好像不大。但对效率的要求而言,就得不偿失了。图形功能是当今及未来电脑的主流之一,由于当初设计者没有远见,导致无穷的后患。
问题尚不止于此,IBM PC/AT 的系统空间,在定址的理论上,可以有 1MB(暂时不必考虑记忆扩充及EMS 等问题),然而真正能提供作为程式执行的空间,却不足 600KB。
我们且看其系统空间的安排:
0000H 段 0000H-007FH 计 128字元,为32个基本中断。
0008H 段 0000H-0380H 计 896字元,供系统管理中断。
0040H 段 0000H-00FFH 计 256字元,为基本程式资料。
0054H 段 0000H-9C00H 约 34K字元,DOS 程式占用。
唯有在 00E1H段-09000H段的前半是使用者可以控制的空间,其后,又被系统占用:
09000H段由0A000H附近直到0FFFFH,为DOS 所用。
0A000H段,为 VGA图形显示区。
0A800H段,为 EGA图形显示区。
0B000H段,为文字态缓冲区,萤幕处理器6845自动管理。
0B800H段,为图形态显示区,萤幕处理器6845自动管理。
0C000H段,至0D000H段,各机种不定,供 EMS扩展记忆。
0C800H段,为唯读记忆体,其内为硬盘控制程式。
0E000H段,1MB 的主机此处为