组合语言之艺术
第三节 分类定义

一、段名(Segment Name)定义
    对段名多于一个的程序,最好先有一个定义段的程序,以DRAW为例,假定程序为两
段,一为控制程序段,一为绘图程序段。数据分为三段,一为应用数据,一为参考数据,
以及制作数据。此外还有一数据索引段,合计有六个段。
    兹建议,在通用的基础上,简化段名,将段分类如下:
    程序段 (CODE SEGMENT) 定名为 CG
    数据段 (DATA SEGMENT) 定名为 DG
    索引段 (INDEX SEGMENT)定名为 IG
    记忆段 (MEMORY SEGMENT) 名为 MG
    特设段 (EXTRA SEGMENT)定名为 EG
    堆栈段 (STACK SEGMENT)定名为 SG
    当各段超过一组时,则再加数字以区分之。
    如在 DR-SEG.ASM 中,可设为:
    1: TITLE   SEGMENT DEFINITION OF PROGRAM 'DRAW'
    2: CG1   SEGMENT PUBLIC
    3: CG1   ENDS
    4: CG2   SEGMENT PUBLIC
    5: CG2   ENDS
    6: DG1   SEGMENT PUBLIC
    7: DG1   ENDS
    8: DG2   SEGMENT PUBLIC
    9: DG2   ENDS
   10: DG3   SEGMENT PUBLIC
   11: DG3   ENDS
   12: IG   SEGMENT PUBLIC
   13: IG   ENDS
   14:     END
    在 SEGMENT PUBLIC 之后,有多种表示方式:
    SEGMENT PUBLIC XXXX
      XXXX=CODE 表示为程序段,在联接时,属程序的段与段前后衔接。两段程序之
间,以 000H 填充至「节」( 每十六个字符为一「节」 )之首位。
      XXXX=DATA 表示数据段,在联接时同上。
      如果程序员为了某种原因,必须严格控制程序之位置及长度时,不宜使用上述
两种方式。
      最简单之陈述方式,即在 SEGMENT PUBLIC之后,保持空白。
      XXXX=BYTE 表示程序联接后,各程序之间紧密接合,不留空位。这种方法,有
利于程序精简。
      XXXX=WORD 表示程序联接后,各程序之间紧密接合,但在后面的程序必然由双
数字起。
    又如在 XXXX 前后加以引号如:
    SEGMENT PUBLIC 'XXXX'
    此一宣告,用以通知汇编程序各段的顺序及定义。因此在编写程序时,只要使用的
段名及定义与本档相符,不管将各段安排在程序任一位置,都不致发生错误。
    'XXXX'与本段程序的排列顺序有关,在联接时,先将引号中的字符串排序妥当,各
程序即依此顺序排列之。
    也就是说,凡是使用了引号,则程序联接的顺序,即以在引号中字符串,于联接时
出现先后为顺序。
    单一程序档的错误不难测知,但若各段之间发生错误,对经验不足的程序员,将有
无从下手之虞,不得不慎!
    一般说来,在联接时,最令人头痛的错误讯息为:
    'Fixup overflow at nnnn..'
    不论其错误提示内容如何,此种错误的发生,多半是因为段与段之间的标题、缓冲
器或是寄存器的使用发生了混淆,联接程序得不到正确的信息所致。
    解决方法是在第一个错误讯息出现时,立刻以'Ctrl_C'停止汇编,记下第一个讯息,
再在原程序中,找到该位置,(多半为一标题位置)在此标题之前,一定会发现与「段」
有关的错误。
二、原始档(Source File)文件名定义
    在共同设计大型模块时,程序员间的默契,全赖事先相互约定。否则程序越大,所
面临的困难将越多,经常耗时费事,甚至最后功败垂成。
    因此,在设计之初,必须妥善规划,将一应有关的档案、名称、功能等,皆明确地
加以定义。参与设计的程序员,更必须严格遵守,方能得心应手。
    原始文件名的定义,其目的有三:
  1,代表程序设计者:当制作的程序甚多时,一见文件名,就应能分辨出各个程序的设
计人。再如某程序员所编程序在一  个以上,则应在其本人代码之后,加一数字编号。
这样,遇有任何问题,立即可以找到来处,进行追踪。
  2,代表程序功能:每当联结后发生问题时,应能由文件名查知问题所在,故每种功能
宜给予适当的名称。
  3,代表联结的关系:除了功能外,有时尚须表示各程序之间的联结关系。如某一程序
必须安排在另一程序之前或后,亦应在文件名最后,以数字表示顺序。
    若参与的程序员不超过廿人,则以一字符为限,各人事先选定一个字母,作为档案
名称的第一字符。第二字符则视该程序员是否编写一个以上的程序而定,是则取一数字
代表之,若无则免。
    功能以三到六字符为宜,能统一长度将更为方便,余下一字符留供数序用。
    例:程序员代号为'C',本程序之编号为3,功能为'DRAWS',此外并无联结关系,
则其名应为:
      CDRAWS3.ASM
三、标题定义
    程序在整理或测试时,最大的困扰,是寻找某一个标题的出处或功能。如果在同一
档中,尚可利用CREF.EXE,打印出一份对照表来;如果不知道出自哪一个档案,在众多
的程序中,就只有望洋兴叹了。
    至于功能,如名称定得太长,不仅输入、修改不便,而且会使得程序看来杂乱无章,
令人眼花撩乱。如果定得太简单,或各人任意定名,则难以理解。
    所以,标题定名之重要性,不下于程序之写作。尤其是在参与人数众多时,标题不
仅要统一,而且要能代表所有必备的讯息。
    标题所代表的讯息有:
       A x x x x x x x x
       │└┬┘└┬┘└── 分支代号
       │  │  └──── 延伸定义
       │  └─────── 功能名称
       └───────── 程序出处
  1,程序出处:如果很多人同时参加一个计划,而某程序员仅写了一个程序,此定义即
为该程序员之代码。否则尚要附  加编号,以便随时可查到。即使只有一个人写作程
序,程序可能不断扩大,为了制作的方便,或为了模块的分割,常有必要将程序分到其
它档中。因此,一段程序究竟出自于哪一个档案,全赖标题表明,以便能迅速地找到。
      程序出处一般用一个字母即可,如前述第一个字母A代表此段程序来自编号为
A的原始档;或属于以A为代号程序员的程序。
  2,功能名称:除若干已知会用到的功能可以事先定义外,其余的多半是在发展过程中,
针对需要而产生。对功能定义千万不要掉以轻心,一个程序的再利用价值,常与其功能
定义息息相关,明确的定义,可以令人对其功能及应用方式一目了然。
      功能名称长度以三个字母为宜,太长则输入费时,尤其是国人不见得个个英文
了得,与其写错,不如藏拙。
      如:DSP 表示屏幕显示功能
        PRN 表示打印功能
        KIN 表示键盘输入功能
  3,延伸定义:若功能相同的程序过多,2,中的定义方式难以分辨,则可再加一延伸定
义。
      如:DSPDOT表示显示点阵
        PRNCHI表示打印中文
        KINASC表示输入 ASCII 字符
  4,分支代号:在程序中常有分支,分支代号最理想是由小而大,依序安排。但由于写
作时常难以预知后情,故宜先留空号,以便扩充。
      如:DSPDOT10
        PRNCHI06
        KINASC24
四、缓冲器定义
       B x x x x x x x
       ││└┬┘└┬┘
       ││  │  └─── 延伸定义
       ││  └────── 功能名称
       │└──────── 类型
       └───────── 缓冲器保留字
      第一个字母规定用'B',为缓冲器保留字。
      第二个字母定义其类型:
      Q=QWORD   如:BQxxxx 缓冲器长度为8字符。
      D=DWORD   如:BDxxxx 长度为4字符。
      W=WORD   如:BWxxxx 长度为2字符。
      B=BYTE   如:BBxxxx 长度为1字符。
      S=STRING  如:BSxxxx 不限长度,但限BYTE型。
      O=ORIGINAL  如:BOxxxx 表不可破坏的原始数据。
      F=FLAG   如:BFxxxx 用作旗号。
      第二字母以后所采用功能或延伸定义,与三、2,3相同。此外,所有缓冲器皆
应统一设在缓冲器专用程序中,若系临时使用,或尚未正式联接,亦应设在各程序之首,
以便于查阅、修改。

上一页    下一页