汇编语言的艺术:(组合语言的艺术)准备工作
第一节 系统
一、系统之选择
只因真正瞭解电脑的人太少,迷信名气的结果,使得 IBM PC/AT占有了市场。为求电脑普及应用,我们唯有因陋就简,针对 IBM PC/AT及其兼容系统,作进一步的分析和说明。
尽管使用 80486 CPU的微电脑已问世,我个人认为以其造价及功能而言,并不符合效率法则。在从事艺术工作的立场,价值的高低,与所采用的材料没有绝对的关系。更何况我们正要证明,利用组合语言的制作技巧,能够使功能不高的微电脑发挥最大的边际效益。故本书仅以8088 CPU指令为研讨对象,至于程式应用在什么机型,就不在本书的考虑范围内了。
二、目录及磁盘
假定读者为有经验的程式师,且电脑为 IBM PC/XT/AT。则在着手制作程式之初,应该先将系统准备妥当。即所谓「工欲善其事,必先利其器」,如果未能注意到下面所提的细节,仅仅制作一、两个程式尚可应付。待工作量一大,程式渐渐增多,不是某些程式找不到,就是找到了也不能一目瞭然。结果是心烦意躁,马马虎虎,另外再写一个,勉强应付了事。
硬盘空间较大,应行注意的事相对的也较多。首先应妥善规划好目录及子目录的分类及应用方式,否则每当要找一个档案时,往往有大海捞针之叹。再不然,在修改程式时,如果将不同的版本放在一起,一定会张冠李戴,错误百出。
每位程式师都应该有自己的目录,而且每个不同的整套档案都应有不同的子目录,这样方能明确的分辨以及应用。而最有效率的方法是,在每一子目录中,档案数不宜太多,且仅存放在同一工作项目下所需要的程式。
一旦硬盘坏了,所有贮存资料均将付诸流水。为了安全,一定要用软盘备份。最好每天复制一次,虽然每次复制,相当麻烦,但是万一程式被毁坏,那种损失是无从估计的。
最好的方法,是制作一个专门复制的工具,一般用 .bat 应用程式,每天工作完毕,只要执行一次即可。
三、应用工具
程式写作是为了控制电脑运作,应用工具则是将程式师的观念和理解转化为能够连续执行的指令。因此,市面上的应用工具虽多,却不见得对程式的写作有所助益。下面列了几种,只要运用纯熟,绝对够用了。
程式写作:EDLIN ,PE II,WS等。
程式编译:masm.exe
早期 (1.25) 版本容许较多的「外界标题」,即external label,但该版本仅限用于8088指令,较宜大型程式处理。
4.0 以前的版本,于档案开始时,可用.xcref以产生标题及缓冲器的位址对照表。但后期的版本会发生错误,不能再用。
程式联接:link.exe
早期的版本对 segment public 'xxxx' 有些规定,但 3.0以后,除了对code及 data 有效外,其他如 byte 及 word 等皆无作用。
程式侦错:debug.exe 或 symdeb.exe 及 mapsym.exe
后两者为套件,必须另购。其优点为在侦错过程中,可以使用原程式中的标题名称,且可设「断点」等,侦错方便,功能较强。
系统处理:pctools.exe 是 dos下很有用的工具,可以作档案管理,也可用来直接修改程式机器码。此外,连机时可以用ll.exe 或xtalk.exe等。尤其是系统程式的侦错,经常需要用联机的方式,以另一台微电脑作为监视器。
这些工具应统一放在 \dos 子目录中,且须在系统之自动执行程式(autoexec.bat)里,先设妥优先通道(path)如:
1:PATH=\DOS;
是则,不论在哪一个子目录中,前述之工具皆可使用。
四、简化名称
前述各种工具,在程式侦错过程中使用频繁,为了应用上的方便,如果能少输入一些字符,不仅节省时间,且可避免错误。令用者在惯性反应下,得以集中精神,思考其他细节。
简化名称是最简单的方法,最好只用一个字母,由于长度相等,其后面的档案名称,就可以利用系统所提供的“F3”「复制上行」功能,不必再行输入。
是以:edlin.com 改为 e.com
masm.exe 改为 m.exe
link.exe 改为 l.exe
debug.exe 改为 d.exe
symdeb.exe 改为 s.exe
例如:在完成一个程式后,若要汇编,只要改第一个字母即可。
c:\>e myfile.asm ( 原来在系统中输入的字符 )
此时仅输入“M”,再按“F3”键,立即变为:
c:\>m myfile.asm
此外,如不需 .lst 等档案,则再加一“;”即可。
c:\>m myfile.asm;
“L”及“D”等同样都可依循上面的方法,看来是雕虫小技,但实际上所节省的时间及精力却不同凡响。
五、参考资料
除专门性的资料外,程式师应该备妥各种有关输出、入,各种周边设备的参考资料或手册等,以便随手查阅。
最重要的是软件参考手册 MS-DOS Software Reference,其中有各种中断命令的使用规格。唯应注意的,是有一些中断功能与IBM BIOS相同,我建议读者不要使用这些中断,因其调用过程中,要借道BIOS,会使速度减慢。
其次为 IBM Programmer's Manual 的BIOS中断规格, 是处理所有周边设备必需的工具。
正因为它涉及周边设备,在设计中文系统时,输出入、显示及列印等功能都有待修改,这本手册更须彻底瞭解。
此外还有键盘的输入码表,也是编程必备的资料,本书附录三即为简要的码表介绍。
如果是编写应用程式,上述的资料已足够应付,但若涉及系统,则尚需瞭解系统的记忆空间安排,下表为 IBM微电脑的记忆区结构。各种厂牌设计理念虽有差别,但大同小异。
系统段 位 址 机 能 用 途
┌──────────────┐
0000 0000H │中断调用表 │
├──────────────┤
0000 0500H │DOS 及系统操作区 │
├──────────────┤
0000 4C00H │周边控制程式 │
├──────────────┤
0000 5400H │COMMAND 运用 │
├──────────────┤
0000 0E0A0H │使用者操作空间 │
├──────────────┤
000A 0000H │萤幕缓冲区(VGA) │
├──────────────┤
000B 0000H │萤幕缓冲区(CGA,EGA) │
├──────────────┤
000C 0000H │EMS 记忆体扩充区 │
├──────────────┤
000F 0000H │ROM BIOS 程式区 │
└──────────────┘
上述之系统段,调入段暂存器中时,原来的 000AH应该是0A00H,余同。
又使用者操作空间的起始点,因各家设计而异。