汇编语言的艺术-基本认识(一)
2007-04-25 09:30:11 来源:WEB开发网二进位就是开关的观念,把一连串的开关联在一起,其所能发生的作用,完全在于每一个开关、以及各开关组合应用的功能。
说得明确一点,先要将各种需要设计的功能分析清楚,找出其共通的因素,如果这些因素能用「开」及「关」两个简单的状态代表,则可以用二进位制加以控制。在理论上,一开一关只有两种作用,而两组开关就有222 种作用,最理想的设计 是将开关的排列组合数用到极限。
举例而言,电脑上应用的彩色,就是最理想的设计之一。在电脑中,最基本的应用单位为「字元」(Byte),每一字元有8个「位元」(Bit),相当于8个「开关」。为了要最精简地应用多种彩色,只以三原色与辉度组合,八个开关就能产生 256种不同的彩色。兹将各开关所代表的彩色分列如下:
开关一 (bit 1):正蓝色
开关二 (bit 2):正绿色
开关三 (bit 3):正红色
开关四 (bit 4):灰色 (高辉度)
开关五 (bit 5):黑色 (低辉度)
开关六 (bit 6):浅蓝色
开关七 (bit 7):浅红色
开关八 (bit 8):浅青色
★上述 (bit n) 是从 n=1 开始计算。
应该注意的一点,是电脑的基本单位在于八个开关,不用足就是浪费。如果8个不够,再增加便有16个。所以,因事制宜,在设计的时候,唯有用8的倍数才划算。
但是,宇宙中的事物,不见得刚好是八的倍数。如果设计的人没有这种认识,不能把所处理的资料,以8为限制条件去划分,就无法利用这种有利的条件,当然,也就得不到最理想的结果。
所以,要想程式具有最高的效率,首先要把资料整理成为八的倍数值结构。把资料整理为最有效的结构方式,称为「资料结构」,关于这一点,在后面将有较详细的例证。
每个字元有 256种排列组合,即相当于 256个十进位的数字。为了方便人的理解,通常将字元写成十六进位形式,并在其数字后加一‘H’,以别于十进位数字。
兹将十进制与十六进制对应表列于下面:
二进位值 八进位值 十进位值 十六进位值
0 0 0 0H
1 1 1 1H
*10 2 2 2H
11 3 3 3H
*100 4 4 4H
101 5 5 5H
110 6 6 6H
111 7 7 7H
*1000 *10 8 8H
1001 11 9 9H
1010 12 *10 0AH
1011 13 11 0BH
1100 14 12 0CH
1101 15 13 0DH
1110 16 14 0EH
1111 17 15 0FH
*10000 *20 16 *10H
★ 凡前有 *者表示进位。
★★二进位数后应加‘B’,八进位后应加‘O’。
由上可知,十六进制仍沿用十进位数字,只是到了10时,已无现成数字可用,只好借用英文字母。在程式中,汇编程式为了分辨ASCII 字符与十六进制数值,通常规定凡十六进位数值以英文字母开始者,在其字母前加一‘0’。
三、对暂存器的认识
暂存器 (Register) 相当于调色皿,资料相当于色料。把色料放进调色皿里,为的是要得到预定的效果,暂存器对于资料亦然。
调色皿有大有小,深度有深有浅,其目的是针对不同的情况,以作有效的处理。暂存器也是一样,应用得好,程式会很精简,容易修改、阅读。否则,想到哪一个就用哪一个,没有原则,没有章法,这种程式委实不敢恭维。
暂存器的重要性,在于处理方便灵活、速度快,占用空间小。不幸8088 CPU的暂存器很少,用起来总是捉襟见肘,辛苦异常。正因为此,暂存器的善用与否,成为程式效能高低的关键技术。
有些程式师不愿意精打细算,经常设定一些「缓冲器」,利用缓冲器可以任意定名、便于记忆的优点,竟把珍贵的暂存器,当作各缓冲器间、搬运资料的交通工具,只见资料不停的搬进搬出。虽然程式师省了点事,但运行速度白白浪费了,空间也被糟蹋了。写这样的组合程式,远不如去用高阶语言。
当然,缓冲器是有必要的,但也只限于「必要」的情况,而且,在程式规划时,就要考虑各种应用的条件,把缓冲器内的值取出后,一次处理完毕。如果不能一次解决或是经常要用到的资料,则设法放在暂存器中。
实际上,任何程式不可能在一个过程中,同时需要很多特殊的资料。好的程式师能把复杂的工作处理得有条不紊,功力不够的,往往把简单的事情弄得令人难以理解。8088的暂存器的确是不够用,但是却不至于少到要以缓冲器取代的地步。
工作的好坏、成败,与人的组织能力有绝对的关系,限于篇幅,我们不能多谈。可是,利用暂存器的特性,来处理繁杂的资料,倒也是训练组织力的方法之一。
首先,我们应该把暂存器视为工具,瞭解工具的功能、性质,然后要能铭记于心,纯熟地加以运用。
根据个人的理解,暂存器概分六类:
1,分段用
程式段 CODE SEGMENT :CS
资料段 DATA SEGMENT :DS
堆栈段 STACK SEGMENT :SS
特设段 EXTRA SEGMENT :ES
2,堆栈用:
堆栈值 STACK POINTER :SP
栈用器 BASE POINTER :BP
3,记忆转换用:
源存器 SOURCE INDEX :SI
终存器 DESTINATION INDEX :DI
4,一般用:
累积器 ACCUMULATOR :AX
兼用器 BASE :BX
计数器 COUNTER :CX
资料器 DATA :DX
5,标志用:旗号值 STATUS :FLAG
6,指示用:执行值 INSTRUCTION POINTER :IP
为了便于记忆,我们给暂存器定中文名,其定义为:
凡分段用者率称「段」,做为各段起始位置指示用,其计值方式为:系统中的绝对地址=(本值×16)+各段定址值
如:资料段为 1600H,乘16即为16000H。
更多精彩
赞助商链接