第 4章汇编语言程序设计汇编语言的格式4.1
语句行的构成4.2
指示性语句4.3
汇编语言程序设计及举例4.4
4.1 汇编语言的格式
下面先介绍一个例子来说明 80C51汇编语言的格式。
ORG 00H ;定义程序的入口
LJMP MAIN ;跳转至此程序入口
ORG 30H ;本程序开始存放的地址
COUNT EQU 04H ;定义符号 COUNT
MAIN,MOV DPTR,#BCD1 ;置 BCD1的地址指针
MOV R0,#BCD11 ;置 BCD11的地址指针
MOV R2,#COUNT ;循环次数送至 R2
LOP1,MOV A,#0 ;为变址寻址置 A的初值
MOVC A,@A+DPTR ;利用变址寻址从程序区取第一个
BCD数的第一个字节至累加器 A
MOV @R0,A ;把数存至 RAM区 BCD11处
INC DPTR ;修改地址指针
INC R0
DJNZ R2,LOP1 ;未完循环
MOV DPTR,#BCD2 ;为 BCD2置地址指针
MOV R0,#BCD11 ;置已在 RAM中的第一个 BCD数的
地址指针
MOV R1,#SUM ;置存放和的地址指针
MOV R3,#COUNT ;置循环次数
LOP2,MOV A,#0 ;为变址寻址置 A的初值
MOVC A,@A+DPTR ;用变址寻址取进第二个 BCD数的
第一个字节
ADDC A,@R0 ;与第一个 BCD数的相应字节相加
DA A ;十进制调整
MOV @R1,A ;存和
INC DPTR ;修改地址指针
INC R0
INC R1
DJNZ R3,LOP2 ;未完循环
MOV A,#00H ;清零累加器 A
ADDC A,#00H ;与最后一次加法可能产生的进位
位相加
MOV @R1,A ;存进位位
J1,JMP J1 ;模拟暂停指令
ORG 20H ;规定存放预置数据的地址
BCD1 EQU 20H
DB 44H,55H,66H,77H;用 DB伪指令在程序区中预置数据
BCD2,DB 55H,44H,55H,88H
ORG 60H
BCD11 EQU 60H
DS 4 ;在 RAM中预留空间以存放从程序
区中取出的数据
ORG 70H
SUM EQU 70H
DS 5 ;为和保留空间
END
4.2 语句行的构成
4.2.1 标记
1.汇编语言的字符集
( 1)字母
包含大写的英文字母,ABCD…XYZ ;
小写的英文字母,abc…xyz 。
( 2)数字
阿拉伯数字,0123456789。
( 3)特殊字符
图 4-1 汇编字符集中可打印字符
2.界符
界符( delimiters)是一些特殊字符,
利用它们可以表明某个标记的结束,它们本身也有一定的意义,这一点就与分隔符
(空格)不同。例子中的冒号(:)、逗号(,)都是一种界符。
3.常量
凡是出现在 80C51源程序中的固定值
(它在程序运行期间不会变化),就称为常量( constants)。例子中的数 0,3、
100等都是常量,而且是数字常量。
汇编语言中允许的常量有数字常量和字符串常量两种。
( 1)数字(整数)常量
( 2)字符串常量
4.标识符
一个标识符是由最多为 31个字母、数字及规定的特殊字符(? @ _ $)等组成的,
且不能用数字打头(以免与十六进制数相混淆)。
5,保留字
6,注释
4.2.2 符号
1.寄存器( registers)
2.变量( variable)
3.标号( label)
4.数
4.2.3 表达式
1.操作数( operands)
( 1)常量操作数
( 2)存储器操作数
2.运算符( operators)
( 1)算术运算符
( 2)逻辑运算符
( 3)关系运算符
4.2.4 语句
如前所述,一个汇编语言的源程序是由一条条语句( statements)组成的,语句就是完成一个动作的说明。源程序中的语句可分成如下两类。
一类是指令语句,汇编程序把它们翻译成机器代码,这些代码命令 80C51执行某些操作,如 MOV,ADD,JMP等。
另一类指示性语句(伪指令),汇编程序并不把它们翻译成机器代码,也不可能翻译成机器代码,只是用来指示、引导汇编程序在汇编时做一些操作,如定义符号、分配存储单元、初始化存储器等,所以伪指令本身不占用存储单元,例如:
4.3 指示性语句
在 Ax51宏汇编中有以下几种指示性语句( directive statements):
① 符号定义( symbol definition)语句;
② 数据定义( data definition)语句;
③ 结束( termination)语句。
4.3.1 符号定义语句
1.等值语句 EQU
NAME EQU 表达式
2.定义汇编过程中的变量语句 SET
SET语句的格式为:
符号名 SET 表达式
3.给内部 RAM的位单元定义一个符号位地址语句 BIT
BIT语句的内格式为:
4.给直接寻址的内部 RAM字节单元定义符号名语句
DATA
DATA语句的格式为:
符号名 DATA 表达式
4.3.2 存储空间初始化语句
存储空间初始化语句,其格式与指令性语句基本相似,也由 4个字段组成,其格式如下:
[标号,] 伪指令助记符 参数 1,参数 2,…… [;注释 ]
此类伪指令共有 4条,DB( Define
Byte,定义字节)和 DW( Define Word,
定义字)仅适用于 ROM空间,为 ROM区间填充常数或常数表格; DS( Data byte
Reserve Space,为数据字节保留空间)
和 DBIT(Data BIT reserve space,为数据位保留空间 ),用来从其一 RAM地址开始预留一些单元,作为变量空间。
1,DB— 在 ROM空间定义一个字节数值串
[标号,] DB N1,N2,…,Nx
P O WE R_ 2 1
+1 2
+1 4
+1 8
+1 16
图 4-1 包含 2的权的字节的表
2,DW— 在 ROM空间定义一个字列表(地址表)
DW伪指令的格式与功能与 DB类似,
只是 DW定义的是一个双字节的字序列。每个数据项占 2个字节,并且 16位二进制数的高 8位存放在低地址单元,而低 8位存放在高地址单元。 DW通常用于在 ROM中定义一个 16位的跳转地址表。
3,DS— 在 RAM中保留指定数量的字节单元
DS语句的格式为:
[标号,] DS nn
自标号开始在 RAM中保留 nn个字节单元,用以存放程序运行过程中产生的数据或变量。 nn可以是数值常量或在汇编过程中能产生数值的表达式。例如:
4,DBIT— 在 RAM中保留指定数量的位单元
DBIT伪指令与 DS为指令类似,只是它在 RAM中保留指定数量的位单元,以储存在程序运行过程中产生的位变量。用以指定位单元数量的,nn”可以是数值常量或表达式。
4.3.3 起始语句
起始语句 ORG( origin),它规定了段内的起始地址。伪指令 ORG 的一般格式为:
ORG 〈 表达式 〉
4.3.4 结束语句
END
4.4.2 分支程序设计
4.4 汇编语言程序设计及举例
例 4-1 两个 32位 BCD数相加程序。
若有两个 32位 BCD数 DATA1与 DATA2,
DATA1存放在自 50H开始的单元中,
DATA2存放在自 60H开始的单元中。存放时低字节在低地址处,高字节在地址较高处。相加以后的和自 70H单元开始存放,其流程图如图 4-2所示。
图 4-2 直线运行程序流程图
4.4.2 分支程序设计图 4-3 符号函数的程序流程图
4.4.3 循环程序设计
1,用计数器控制循环图 4-4 计数循环程序流程图
程序如下:
2,多重循环
延时子程序如下:
图 4-5 多重循环程序流程图
4.4.4 字符串处理程序设计
1,确定字符串的长度
例 4-3 从头搜索字符串的结束标志,
统计搜索的字符个数,其流程图如图 4-6所示 。
图 4-6 确定字符串长度的流程图
相应的程序如下:
2,加偶校验到 ASCII字符
例 4-4 若有一个 ASCII字符串,它们的起始地址放在单元 STRING内,要求从串中取出每一个字符,检查其中包含的,1”的个数,若已为偶数,则它的最高有效位置
,0”;否则,最高有数位置,1”后送回,
其流程图如图 4-7所示。
图 4-7 加偶校验位至 ASCII字符流程图
相应的程序如下:
4.4.5 码转换程序设计
1.十六进制到 ASCII的转换
例 4-5 若有一个二进制数码串,要把每一个字节中的二进制转换为两位十六进制数的 ASCII,高 4位的 ASCII放在地址高的单元。串中的第一个字节为串的长度(小于 128B)。能实现这样转换的流程图如图
4-8所示。
图 4-8 把十六进制数转换为 ASCII的程序流程图
程序如下:
2.从二进制到 ASCII串的转换
例 4-6 把在内存变量 NUMBER1中的 8
位二进制数,每一位转换为相应的 ASCII,
存入串变量 HEX_1中,其流程图如图 4-9所示。
图 4-9 把二进制位串的每一位转换为 ASCII的程序流程图
3,从 BCD码到二进制的转换图 4-10 3位 BCD数转换为二进制数的流程图