在前面内容的学习中,我们分别介绍了用汇编语言进行程序设计所需要的几个最基本的知识:CPU功能结构、工作模式,内存单元的寻址方式,各种汇编指令格式。在掌握了这些基本内容之后,就需要学习如何把它们组成一个完整的汇编语言程序。
在汇编语言程序设计中,有三类指令:指令、伪指令和宏指令。
指令:汇编后形成一条机器语言指令,指示CPU进行各种操作。它在程序执行时得到运行,它与机器语言指令一一对应。
伪指令:它只告诉汇编程序(MASM.GCC)应如何汇编,而本身并不形成机器语言指令。它在源程序汇编的过程中运行。
宏指令:这是用户自己定义的指令,它由指令、伪指令构成,并在汇编过程中进行宏展开。它也是一种伪指令,没有对应的机器语言指令。
本章的重点是掌握程序的三大结构(顺序结构、分支结构和循环结构等)在汇编语言中的表现形式,高级语言的程序结构向汇编语言的程序结构转换的一般方法。
汇编语言常用编程工具有MASM或GCC,其中,GCC能在Linux编程环境下完成程序的编辑、汇编、调试和运行等步骤,需要重点掌握。
1 标识符与表达式
其实跟其他高级语言一样,汇编语言的入门同样是从标识符与表达式开始的。标识符和表达式是程序设计经常用到的两个基本概念。在用高级语言进行程序设计时,如果程序要对某个变化的量进行处理时,通常都要对该变化量定义一个具有某种数据类型的符号名,用该符号名也就等于使用了该变化量。在汇编语言中,也是如此,所不同的是它们的说明和引用方式不同。
在汇编语言中,标号、内存变量名、子程序名和宏名等都是标识符,它一般最多由31个字母、数字及规定的特殊字符(?、@、_、$)等组成,并且不能用数字开头。通常情况下,汇编语言不区分标识符中字母的大小写,但是为了顾及程序的可移植性,请各位程序员们尽量在程序中区分大小写。
和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会大大改善程序的可读性,并有助于对程序的理解。但标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。
例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是合法的标识符。
试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六位进制数值。
1.1 简单内存变量的定义
在编程序时,我们往往要根据程序的需要定义一些内存单元。在高级语言程序中,要给存储单元取一个符号名,然后通过引用该符号名来访问其所对应的存储单元,而在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。当给存储单元取符号名时,则可通过该符号名来访问其对应的存储单元;当不给存储单元取符号名时,则可通过存储单元的偏移量(有效地址)来访问它。
汇编语言中,常见的数据类型有字节、字和双字等。下面介绍如何定义各种整型类型的内存变量,有关浮点类型变量的定义方式我们不做介绍,具体内容请查阅相关资料。
定义数据变量语句是在程序中经常使用的伪指令语句,其一般格式如下:
[变量名] 数据定义符 表达式1[, 表达式2, …, 表达式n] ;注释
该定义格式的主要解释如下:
l 变量名必须是一个合法的标识符,它可以写,也可以不写;