首页 理论教育 微型计算机原理:汇编语言程序格式

微型计算机原理:汇编语言程序格式

时间:2023-11-03 理论教育 版权反馈
【摘要】:图3-2是一个用汇编语言书写的示例程序,其功能是在屏幕上输出一个“Hello,World!”一般来讲,汇编语言所编写的程序要有三个段:堆栈段、数据段和代码段。

微型计算机原理:汇编语言程序格式

图3-2是一个用汇编语言书写的示例程序,其功能是在屏幕上输出一个“Hello,World!”的字符串,将它汇编和连接之后我们就得到了本章开头给出的那段十六进制程序代码。我们应该还都记得用C语言来编写一个“Hello,World!”是一件多么简单和快捷的工作(见图3-3)。

978-7-111-46342-9-Chapter03-2.jpg

图3-2 汇编语言例子

978-7-111-46342-9-Chapter03-3.jpg

图3-3 C语言例子

相比起来,由于汇编语言编写的程序必须以汇编码的形式对微处理器的每一个动作都加以详细描述,使得用汇编语言编写的程序是如此的烦琐和复杂,以至于我们很难一眼看出这个程序的功能和用途。但是,如果能够正确掌握汇编语言的特性,了解各种伪指令和指令的功能,阅读和编写汇编语言也不再会是一件困难的事情。

下面,我们就来学习汇编语言的特性,了解各种伪指令和指令的功能。

1.语句

汇编语言程序主要由一系列的伪指令语句或汇编指令语句组成,每一条语句占据一行。伪指令又叫伪操作,用来指示汇编程序如何将汇编语言指令转换成机器代码(后面会详细介绍)。汇编语言指令也叫操作,由操作符(助记符)以及零到二个操作数组成,操作符指出CPU要执行什么操作,而操作数给出要处理的数据。其格式一般是:

978-7-111-46342-9-Chapter03-4.jpg

(1)标号可以被视为标号名或变量名,它与紧随其后的代码行地址关联。标号的长度不得超过31个字符,伪指令的标号不需要冒号(:)作结束符,如:

978-7-111-46342-9-Chapter03-5.jpg

汇编语言指令行的标号必须用冒号(:)作结束符,标号只在代码段出现,用来表示其后出现的指令的地址。如:(www.xing528.com)

978-7-111-46342-9-Chapter03-6.jpg

(2)操作符是汇编语句的核心。操作符可以是汇编指令助记符或伪指令,如果操作符是汇编指令助记符,该语句是能够翻译成为机器码的汇编指令,在翻译成机器码后由CPU执行。如果操作符是伪指令的助记符,则该语句就是伪指令语句,伪指令不能生成机器码,它只为汇编程序提供转换源程序的命令。如果操作符是宏定义名,则该指令是宏指令语句。(宏指令语句后面会专门介绍)

(3)注释以分号开始,一般在一条指令的后部,或者从一行的第一个字符开始。汇编程序对于注释跳过不加理会,也不产生任何机器码。注释是程序的设计者在设计程序的时候用来说明一条指令的功能和作用的,好的注释可以帮助程序的阅读者(包括程序的设计者自己)更加容易理解程序和修改程序,善于使用注释是优秀程序员的一个重要特征。

2.汇编语言程序的段

前面我们已经介绍过,8086/8088微处理器对于内存采用分段的管理方式,同样在汇编语言所编写的程序中也不可避免地要对内存进行分段。一般来讲,汇编语言所编写的程序要有三个段:堆栈段、数据段和代码段。

堆栈段(STACK)是为程序堆栈定义的一段存储区,以后进先出(LIFO)的方式工作,其大小可以由用户根据需要指定,最大不能超过64 KB。堆栈段一般由堆栈段寄存器SS指定,并由栈顶指针寄存器SP指出栈顶的地址,作为操作堆栈中数据的指针。堆栈的基本操作是入栈PUSH和出栈POP,即将数据压入栈顶或从栈顶弹出数据,在这个过程中,SP的值也会被自动更改。

数据段(DATA)是程序的数据存储区,在数据段中使用数据定义伪操作定义程序所要使用的各种数据,这些数据被程序中的指令通过变量来引用。和高级语言中的变量概念不同,在汇编语言中,变量仅仅是数据存储单元的符号地址,不包含任何附加含义(如数据类型)。除了数据段之外,汇编语言编制的程序还可以包含一个附加段(EXTRA),用来存储各种附加数据。在执行串操作时,字符串存入的目的地址必须在附加段中,这时程序就必须定义附加段(或者将附加段和数据段指定为同一个段)。

代码段(CODE)是程序代码的存储区,代码段中指令的地址由CS和IP来确定,IP总是保存着下一条要执行的指令的偏移地址。代码段有时又称为正文段(TEXT)。

汇编语言编写的程序一般情况下都需要有这三个段,但是在某些时候其中的一些段是可以省略的。比如在没有过程调用等需要堆栈操作的程序里,堆栈段就可以被忽略。而在某些时候(比如.COM格式的可执行程序中),数据段和代码段共用同一个段,这时就不再需要单独定义数据段。

3.汇编语言程序示例

让我们回到本节开头给出的那个示例程序。在示例程序的开头是一段注释和两个用来标识程序用途和格式化方式的伪指令(TITLE和PAGE)。随后,SEGMENT伪指令标明了一个段定义的开始,紧跟着的ASSUME伪指令则将CS和DS段寄存器都分配给了CODE段。接下来是程序的主体部分,包括用DB定义的字符串数据和以START:标号开始的一段代码。然后是段定义结束的伪指令ENDS和用来表示整个汇编程序结束的伪指令END。

这段程序只定义了一个代码段,将数据储存于代码段之中,省略了数据段和堆栈段的定义。在程序结束伪操作END的后面指出程序的入口为标号START,即整个程序从START标号对应的指令开始运行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈