组合语言之艺术
第二节 工作环境

一、系统空间

    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 的主机此处为 RAM,否则此段不能使用。
  0F000H段,为只读记忆区,其内为基本输出/入程序。

    由上可知,整个系统的规划不尽理想,尤其受限于8088的CPU 原先错误的设计理念
(段寄存器现为寻址的16倍,即每进一,相当于地址增加16。在最初,如果不考虑与80
80兼容,原可轻易地定为 256或更高倍。)所以,当要扩充记忆容量时,便产生了 EMS
这种无可奈何的高科技畸形儿。

二、外围设备

    所谓外围设备,率指须透过系统的输出/入汇流埠(I/O Port),及其管理程序所
控制的外部各种设置。
    在此定义下,键盘就是一种外围设备,除此之外,屏幕显示器、印表机、磁盘驱动
器等,均属外围设备。显然,程序员必须了解每一种外围设备的性质,否则无法下手。
    由于外围设备种类繁多,且各有其使用规格,可以说毫无技巧可言,故本书不拟一
一介绍。要之,把各种设备所定义的规格条件,抄录在记事簿中,以便随时查阅。
    此外,为求程序能有效地应用于各种不同规格的外围设备上,千万不可在应用程序
中统一处理,最好定妥各种界面,作为附属程序,由使用者自行设定。
    这样规划的第一个原因,是无人能预知到底未来需要多少种不同的设备,挂一漏万,
以后程序增改不易,可能导致功能不足,或程序松散的后果。
    第二个原因在,使用者经常使用的设备是固定不变的,将一些永远用不到的程序放
在一起,是无谓地浪费空间。
    第三个原因为技术虽在进步,程序应用观念则难以改变,主导程序与外围设备之界
面程序不应纠结在一起。一个没有渣滓、精心雕琢的程序才有永恒的价值。终有一天,
当计算机技术成熟时,原应用程序无需改动,仅将处理外围设备的附属程序换成新的即
可。
    这就是生命,就是新陈代谢,有了这些认识,才能理解汇编语言的精义。

三、系统程序

    在 IBM PC/AT系统中,只有两种系统程序,一是磁盘作业系统程序 (MS-DOS 或 PC
-DOS ),负责系统激活、记忆区管理以及部份输出/入处理等工作。此系统程序原贮存
在系统磁盘中,开机时才调入系统中,所以容易修改。由最初推出的版本1.0 ,到现在
已是4.01,其功能还在不断地改进中。
    另一种为基本中断服务程序(BIOS),贮存在只读存储器中,除非机种易动,否则
永远不会改变。基本中断程序的主要功能为便利程序员,把所有的外围设备所需要的参
数,统一由寄存器代为传输。程序员可按照规定,把正确的值,放到规定的寄存器中,
基本中断便会优先执行。
    这两种系统程序,程序员必须熟悉,至少,应知道何种功能要用哪一个中断。
    这两种系统程序,都因瞻前顾后,速度不够理想。因之有些程序员,根本不用这些
中断,自行控制输出/入埠。这种做法确实能提高速度,自由控制。而相对的,程序的
通用性也减低了。是否值得,设计前应先考虑清楚。
    此外,这两种中断程序有些相互重复之处,如键盘输入及屏幕输出等,经常令人不
知如何选用。有人建议用磁盘作业的中断,我则认为该用基本中断。
    因为系统容许程序改变基本中断的入口值,所有利用基本中断的程序,都可修改入
口,以增加其应用功能。磁盘作业系统则不然,虽然该程序在磁盘上,且在不断地改进
中,但在改进之时,又必须兼顾过去的客户。时间一久,问题就发生了。且改进越大,
越显得过去的作业方式落伍,兼容就是保留过去渣滓的代名词。兼容性越高,包袱就越
重,空间浪费越大。
    建筑在这种基础上的程序,必须冒种风险:是否有一天,磁盘作业系统会面临运转
困难或遭解体的厄运?O/S2的问世已经表明了,此系统的大限业已到来。
    基本中断可以改变,意思是说,除了一部份BIOS空间的浪费无可避免外,在PC系列
中,系统中断的观念不会再改变。只要程序员能把握基本中断程序的技巧,则不论未来
的系统变化到任何地步,一个具有实用价值的程序,理论上其生命期应该是很长的。

四、配备程序

    配备程序指的是一些非必要的基本程序,只因为特殊需要而调用。通常,它是由某
些系统提供,配备给某些程序的。
    配备程序包括各种计算的函数及绘图公式,特殊处理用的LIB.等,在某些情况下,
也可以将之视为环境,例如窗口管理MS-DOS WINDOW,记忆扩充装置 EMS等。
    配备程序的产生,证明了计算机软件开发的迂回历程,同时也表示出软件的灵活性。
在我个人的观念中,配备程序如果能有一定的设计方式,有统一的规格,很可能在大量
的、不断发展下,成为一个个「公用模块」,并可专门提供模块,以供用户应用,使得
软件的制作变得轻而易举。
    写作或应用这些程序,别无其它法门,唯有熟记于胸,才能得心应手。

五、公用模块

    模块应是未来计算机软件发展的主流,每一类模块的功能,代表了各行各业的经验
及诀窍。使用者无需了解模块的制作技巧,只要知道如何调用,就可以完成工作。
    目前尚无厂商提供「公用模块」,但是随着观念的拓广,一旦有了理论,有人先行
一步,这种潮流即将形成。我们即将推出的"聚珍整合模块",第一阶段尚限于程
序员使用,再下一步,当客户直接调用的界面完成后,程序的发展方向又将改弦易辙了。

上一页    下一页