图2-19 相对寻址示意图
(7) 位寻址
在计算机中,操作数不仅可以按字节为单位进行存取和操作,而且也可以按8位二进制数中的某一位为单位进行存取和操作。当把8位二进制数中的某一位作为操作数看待时,这个操作数的地址就称为位地址,对位地址寻址简称位寻址。 位寻址指令的指令码中含有位地址。计算机根据指令码中的位地址就可以找到位操作数,完成相应位操作。在位寻址指令中,位地址用bit表示,以区别字节地址direct。们在指令码中bit用实际的物理地址代替后计算机区别它们的根据是位寻址指令的操作码,它和字节寻址指令是不相同的。
在MCS-51单片机中,位寻址区专门安排在片内RAM中的两个区域:一是片内RAM的位寻址区,字节地址范围是20H-2FH,共16个RAM单元,其中每一位都可单独作为操作数(见图2-10); 二是某些特殊功能寄存器SFR,其特征是它们的物理地址应能被8整除,共16个,它们分布在80H-FFH的字节地址区(见图2-11)。
为了使程序设计方便可读,MCS-51特地为用户提供了多种位地址的表示方法,归纳起来共有4种:
1)直接使用物理的位地址。例如 MOV C, 7FH ;Cy←(7FH)
其中:7FH为位地址的物理形式,它表示2FH单元中最高位D7(见图2-10)。 2)采用第几字节单元第几位的表示法。例如,上述7FH的位地址可以表示为2FH.7,相应指令为
MOV C, 2FH.7 ;Cy←(7FH)
3)可以位寻址的特殊功能寄存器容许直接采用寄存器名加位数的命名法。例
- 36 -
如,累加器A中最高位可以表示为ACC.7,可以把ACC.7位状态送到进位标志位Cy的指令是
MOV C, ACC.7 ;Cy←ACC.7 4)经伪指令定义过的字符名称。
2.3.3 MCS-51汇编语言 2.3.3.1汇编语言的构成
汇编语言是一种面向机器的程序设计语言,常因机器的不同而有差别。现已MCS-5l单片机为例来介绍汇编语言的构成。 (1) 程序设计语言
计算机程序设计语言是指计算机能够理解和执行的语言,它随着计算机的诞生而诞生,随着计算机的发展而发展。迄今为止,计算机程序设计语言很多,但通常分为机器语言、汇编语言和高级语言等三类,现对它们的性能特点分析如下: 1) 机器语言(machine language)是一种能为计算机直接识别和执行的机器级
语言。通常,机器语言有两种表示形式,一种是二进制形式,一种是十六进制形式.如表2-6所列。机器语言的二进制形式由二进制代码“0”和“1”构成,可以直接存放在计算机存储器内;十六进制形式由0—F等16个数字符号组成,是人们通常采用的一种形式,它输入计算机后由监控程序翻译成二进制形式,以供机器直接执行。机器语言不易为人们识别和读写,用机器语言编写程序具有难编写、难读懂、难查错和难交流等缺点。因此,人们通常不用它进行程序设计。
表2-6 机器语言和汇编语言的形式
2)汇编语言(assembly language)是人们用来替代机器语言进行程序设计的一种语言,由助记符、保留字和伪指令等组成,很容易为人们所识别、记忆和读写,故有时也称为符号语言。采用汇编语言编写的程序称为汇编语言源程序,该程序虽然不能为计算机直接执行,但它可由“汇编程序”翻译成机器语言程序(即日标代码)。汇编(assembler)程序由计算机软件公司编写,可以驻留在微型计算机开发系统的程序存储器内,也可以存放在软盘或硬盘上,使用时调入系统机内存。
汇编语言并不独立于具体机器,是一种非常通用的低级程序设计语言,表2-6中列出了一段MCS-51汇编语言源程序。采用汇编语言编程,用户可以直接操作到
- 37 -
单片机内部的工作寄存器和片内RAM单元,能把数据的处理过程表述得非常具体和翔实。因此,汇编语言程序设计可以在空间和时间上充分发掘微型计算机的潜力,是一种经久不衰的广泛用于编写实时控制程序的计算机语言。
3)高级语言(high-level language)是面向过程和问题并能独立于机器的通用程序设计语言.是一种接近人们自然语言和常用数学表达式的计算机语言。因此,人们在利用高级语言编程时可以不去了解机器内部结构而把主要精力集中于掌握语言的语法规则和程序的结构设计方面。采用高级语言编写的程序是不能被机器直接执行的,但可以被常驻内存或磁盘上的解释程序和编译程序等编译,编译成目标代码才能被CPU执行。随着计算技术的飞速发展,高级语言不仅在类型和版本上有所增强,而且在功能上也越来越接近于人类的自然语言。常用的高级语言有BASIC、FORTRAN、COBOL、PASCAL和VB等,它们都在按自身的规律发展。 (2) 汇编语言格式
根据题目要求,人们采用汇编语言编写的程序称为汇编语言源程序。这种程序是不能被CPU直接识别和执行的,必须由人工或机器把它翻译成机器语言才能被计算机执行。为了使机器能够识别和正确汇编,人们必须对汇编语言的格式和语法规则作出种种规定。因此,用户在进行程序设汁时必须严格遵循汇编语言的格式和语法规则,才能编出符合要求的汇编语言源程序。 汇编语言源程序由—条一条的汇编语言语句构成。这就好像写文章,文章由语句构成,每个语句要正确,不能有病句和漏句,标点符号也要正确。因此,汇编语言源程序中的汇编语言语句也要正确.必须符合相应的语法规则。
汇编语言直接面向机器,因机器而异;对MCS-51来说,汇编语言中的每条语句应当符合典型的四分段格式: 标号段 操作码段 操作数段 注释段 格式中的标号段和操作码段之间要有冒号“:”相隔;操作码和操作数段间的分界符是空格;双操作数之间用逗号“,”相隔;操作数段和注释段之间的分界符采用分号“,”相隔。操作码段是必选项,其余各段为任选项。这就是说,任何语句都必须有操作码字段。
现结合如下程序进行分析: OPG 0060H
START: MOV A, #00H ;A←0 MOV R2, #0AH ;R2←10 MOV R1, #03H ;R1←3 LOOP: ADD A, R1 ;A←A+R1
DJNZ R2, LOOP ;若R2-1≠0,则LOOP NOP SJMP ﹩ END
- 38 -
这个程序共由9条语句组成,第1、9两条是伪指令,其余为指令性语句。第2、5两条是四分段齐全的语句,第3、4、6、7等四条是缺省标号段的语句,第7、9两条只有操作码字段。在第6条语句中,LOOP是一个符号,不是标号地址,实际上是一个相对地址偏移量,可以理解为$-LOOP,$是DJNZ R2,LOOP这条指令操作码所在内存单元的地址。为了进一步弄清汇编语句中各字段的语法规则,现结合本程序对各字段加以说明。
1)标号字段 标号字段位于一条语句的开头,用于存放语句的标号,以指明标号所在指令操作码在内存的地址。标号又称为标号地址或符号地址,是一个可有可无的任选项。例如,上述程序中的START和LOOP皆为标号,分别指明了第2、5两条指令操作码的内存地址。标号由大写英文字母开头的字母和数字串组成,长度为1—8个字符。在标号长度超过8个字符时,汇编程序自动舍去超过部分的字符。为了避免机器错误地把标号中的字符当作指令来汇编,用户在编写自己的程序时绝对不应采用指令保留符、寄存器号以及伪指令符等作为语句的标号,而且同一标号决不能在同一程序的不同语句中使用。
2)操作码字段 操作码字段可以是指令的保留字(如上述程序中的MOV、ADD和NOP等),也可以是伪指令和宏指令的助记符(如ORG和END),用于指示计算机进行何种操作。操作码字段是任一语句不可缺少的必选项,汇编程序根据这一字段生成目标代码。
3)操作数字段 操作数字段用于存放指令的操作数或操作数地址,可以采用字母和数字等多种表示形式。在操作数字段中,操作数个数因指令不同而不同,通常有双操作数.单操作数和无操作数3种情况。
在MCS-51单片机的汇编中,操作数通常有以下5种合法表示形式:
①操作数的二进制、十进制和十六进制形式。在大多数情况下、操作数或操作数地址总是采用十六进制形式表示的,只有在某些特殊场合才采用二进制或十进制的表示形式。若操作数采用二进制形式,则需加后缀B;若操作数采用十进制形式,则需加后缀D;若操作数或操作数地址采用十六进制形式,则需加后缀H。若十六进制的操作数以字符A~F中的某个开头时,则还需在它前面加一个前导“0”,以便机器可以把它和字母A~F区别开来。例如如下程序中的语句都是合法的:
ORG 0500H
MOV A, #00110101B ;A←53 ADD A, #20D ;A←53+20 MOV R0, #20H ;R0←20H MOV R1, #0BFH ;R1←BFH SJMP ﹩ END
- 39 -
②工作寄存器和特殊功能寄存器。当操作数在某个工作寄存器或特殊功能寄存器中时,操作数字段允许采用工作寄存器或特殊功能寄存器的代号表示。例如,上例中的累加器A和工作寄存器R0—R7。
③标号地址。为了便于记忆和编程序方便,操作数字段里的操作数地址常常可以采用经过定义的标号地址表示。例如,若地址M中有一个操作数X,且M已在某处作过定义,则如下指令是合法的:
MOV A, M
④带加减算符的表达式。在上例中,若M已在某处作过定义,则M+1和M-1都是可以作为直接地址来使用的。
MOV A, M+1 MOV A, M+3
⑤采用﹩符,美元符﹩常在转移类指令的操作数字段中使用,用于表示该转移指令操作码所在的内存地址。例如以下指令:
JNB TFO, $
该指令含义是:若TFO=0,则机器总执行该指令;只有TFO≠0时才继续往下执行程序(TFO是TCON中的一位)。
4)注释字段 注释字段用于注解指令或程序的含义,对编写和阅读程序有利。注释字段是任选项,但选用时必须以分号“;”开头,一行不够写需另起一行时也必须以分号“;”开头。在机器汇编时.注释段可以输入系统机,也可以不输入系统机。若需要输入系统机,则汇编时不会产生机器码,但可以原文输出到CRT显示器或打印纸上,供用户阅读和长久保存。当程序较长较复杂时,在汇编语言源程序的适当位置上标上简练的英文注释,这对程序的交流和以后重读颇有方便之处。
分界符也称分隔符,是汇编语言语句的组成部分。汇编程序对汇编语言源程序汇编时,机器遇到不合法分界符就会出错停机,要求用户改正。因此,读者在编程时对每条语句中的分界符也不能掉以轻心,必须正确使用。标号字段中的冒号“:”用于指示标号字段的结束;操作数字段中的逗号“,”用于分隔两个操作数;注释段的开头是分号“;”,操作码字段和操作数字段之间应加空格。 (3)汇编语言构成
汇编语言是汇编语言语句的集合,是构成汇编语言源程序的基本元素,也是汇编语言程序设计的基础。汇编语言语句因机器而异,常可分为指令性语句和伪指令语句两类。
- 40 -