本章主要介绍了汇编语言程序的基本结构与组成、伪指令及其使用方法、D O S功能调用和B I O S功能调用,以及汇编语言程序设计的基本技术。
本章还给出了汇编语言程序上机和调试的实例。
通过该实例,可以了解汇编语言程序设计与开发的全过程。
本章中介绍的程序设计技术包括简单程序设计、分支程序设计、循环程序设计和子程序设计,每种程序设计均给出了多个具体实例,并对设计思想进行了分析,提供了有价值的程序设计技术和方法。
使用这些技术和方法可以为PC机开发基于汇编语言的软件。
6.1汇编语言与汇编程序6.1.1汇编语言的基本概念1.机器语言与汇编语言(M a c h i n e L a n g u a g e a n d A s s e m b l y L a n g u a g e)计算机程序由一系列指令序列组成。
计算机通过对每条指令的译码和执行来完成相应的操作。
指令必须以二进制代码的形式存放在内存中,才能够被计算机所识别和理解,并加以执行。
由二进制代码表示的指令称为机器指令,相应的程序称为机器语言程序。
机器语言程序由0、1二进制代码组成,不便于编程和记忆。
由此产生了用指令助记符表示的汇编语言指令,对应的程序称为汇编语言程序。
例6-1将4位二进制数转换为A S C I I码字符。
当数在0000B-1001B时,对应的A S C I I 码为‘0’-‘9’;当数在1010B-1111B时,对应的A S C I I码为‘A’-‘F’。
设待转换的数据已在累加器A L中(低4位)。
8086汇编语言程序如下:A N D A L,0F HC M P A L,0A HJ B N U MA D D A L,07HN U M:A D D A L,30HR E T对例6-1程序进行汇编以后,得到8086汇编指令对应的机器代码(用十六进制数表示),如表6.1所示。
在表6.1中,第一列表示机器代码存放的内存地址,该地址与机器所处的环境有关;第二列表示8086机器代码,每条指令的机器代码由一个或几个字节组成;第三列表示汇编指令,由指令助记符和操作数组成。
指令前可能有标号,表示该指令第一个字节所在的地址。
表6.1汇编后的机器代码地 址 机器代码 对应的汇编指令E380:0000240F A N D A L,0F HE380:00023C0A C M P A L,0A HE380:00047202J B N U ME380:00060407A D D A L,07HE380:00080430N U M:A D D A L,30HE380:000A C3R E T2.汇编语言与高级语言(A s s e m b l y L a n g u a g e a n d C o m p u t e r-i n d e p e n d e n t L a n g u a g e)从例6-1可见,汇编语言程序的基本单位仍然是机器指令,只是采用助记符表示,便于人们记忆。
因此汇编语言是一种依赖于计算机微处理器的语言,每种机器都有它专用的汇编语言(如8086C P U与8031单片机的汇编语言即不相同),故汇编语言一般不具有通用性和可移植性。
由于进行汇编语言程序设计必须熟悉机器的硬件资源和软件资源,因此具有较大的难度和复杂性。
高级语言,如B A S I C,F O R T R A N,C语言等是面向过程的语言,不依赖于机器,因而具有很好的通用性和可移植性,并且具有很高的程序设计效率,便于开发复杂庞大的软件系统。
既然高级语言有很多优点,为什么还要学习汇编语言呢?理由如下:⑴ 汇编语言仍然是各种系统软件(如操作系统)设计的基本语言。
利用汇编语言可以设计出效率极高的核心底层程序,如设备驱动程序。
迄今在许多高级应用编程中,32位汇编语言编程仍然占有较大的市场。
⑵ 用汇编语言编写的程序一般比用高级语言编写的程序执行得快,且所占内存较少。
⑶ 汇编语言程序能够直接有效地利用机器硬件资源,在一些实时控制系统中更是不可缺少和代替。
⑷ 学习汇编语言对于理解和掌握计算机硬件组成及工作原理是十分重要的,也是进行计算机应用系统设计的先决条件。
6.1.2汇编语言源程序的组成1.汇编语言源程序的结构(P r o g r a m S t r u c t u r e)例6-2将一个8位二进制数分成高4位和低4位分别转换为两个A S C I I字符。
设待转换的数据及转换好的A S C I I字符均存放在数据段中。
完整的汇编语言源程序如下:N A M E H E X T O A S C;*********************************************************D A T A SE G M E N T;数据段定义开始H E X D B5A HA S C D B2D U P(?)D A T AE N D S;数据段定义结束;*********************************************************;*********************************************************S T A C K S E G M E N T;堆栈段定义开始D B256D U P('S')T O P E Q U$-S T A C KS T A C K E N D S;堆栈段定义结束;*********************************************************;*********************************************************C ODE S E G M E N T;代码段定义开始A S S U M E C S:C O D E,D S:D A T A,S S:S T A C K ;.........................................................S T A R T:M O V A X,D A T A;主程序开始M O V D S,A XM O V A X,S T A C KM O V S S,A XM O V S P,T O PM O V B X,O F F S E T A S CM O V A L,H E XM O V A H,A LM O V C L,4S H R A L,C LC A L L N E A R P T R C O N V E R TM O V[B X],A LI N C B XM O V A L,A HC A L L N E A R P T R C O N V E R TM O V[B X],A LH L T;主程序结束 ;.........................................................C O N V E R T P R O C;过程(子程序)定义开始A N D A L,0F HC M P A L,10J B N U MA D D A L,7N U M:A D D A L,'0'R E TC O N V E R T E ND P;过程(子程序)定义结束 ;.........................................................C ODE E N D S;代码段定义结束;*********************************************************E N D S T A R T;程序结束从例6-2中可以看出,汇编语言源程序一般包括了数据段、堆栈段和代码段,即程序由段结构组成。
它们由段定义开始语句“S E G M E N T”和段定义结束语句“E N D S”来定义一个段。
每个段都有一个段名,段名可自由选取,如数据段的段名为“D A T A”,堆栈段的段名为“S T A C K”,代码段的段名为“C O D E”。
数据段、堆栈段和代码段的作用各不相同。
数据段用于存放变量、数据和结果,堆栈段用于执行压栈和弹栈操作,以及子程序调用和参数传递,代码段则是所编制的执行程序或常数表格。
各个段都由一系列语句组成。
语句包括指令语句和伪指令语句。
指令语句(I n s t r u c t i o n S t a t e m e n t s)产生对应的机器代码,指定C P U做什么操作,而伪指令语句(D i r e c t i v e S t a t e m e n t s)并不产生机器代码,仅仅起控制汇编过程的作用,它指定汇编器(A s s e m b l e r)作何种操作。
汇编器是专门把汇编语言源程序汇编成机器语言的工具软件。
它通过伪指令来了解诸如“变量名列表”、“变量所在位置”、“过程名”等信息。
在例6-2中,N A M E,S E G M E N T/E N D S,D B,E Q U,O R G,A S S U M E,P T R,P R O C/E N D P,E N D等都是伪指令,它们是汇编语言源程序的重要组成部分。
2.汇编语言的语句格式(S t a t e m e n t F o r m a t s)汇编语言程序的每行语句由1~4个部分组成。
指令语句和伪指令语句在格式上稍有区别,指令语句的标号后有冒号“:”,而伪指令语句的标号后则没有冒号。
指令语句的格式为[L A B E L:]O P E R A T I O N[O P E R A N D][;C O M M E N T]标号域 指令助记符域 操作数域 注释域伪指令语句的格式为[L A B E L]O P E R A T I O N[O P E R A N D][;C O M M E N T]标号域 伪指令助记符域 操作数域 注释域语句格式中用方括号括起来的部分,可以有也可以没有。
每部分之间用空格(至少一个)分开,一行最多可有132个字符。
L A B E L:标号域,表示段名、变量名、过程名或指令符号地址等。
O P E R A T I O N:助记符域,为指令或伪指令的助记符。
O P E R A N D:操作数域,表示操作的对象,由一个或多个表达式组成,表达式与表达式之间必须用逗号“,”分开。
C O M M E N T:注释域,用来说明语句的功能,以“;”开始。
汇编程序对“;”以后的部分不予汇编。
指令助记符前面还可以有[前缀]。
汇编程序语句中的四个域,均可以用大写、小写或大小写混合编写。
3.标号(L a b e l)标号是一个自行设计的标识符或名称,最多可由31个字母、数字和特别字符(?、@、_、$)等组成。