第四章 汇编语言程序设计DOC.docx
《第四章 汇编语言程序设计DOC.docx》由会员分享,可在线阅读,更多相关《第四章 汇编语言程序设计DOC.docx(5页珍藏版)》请在冰豆网上搜索。
第四章汇编语言程序设计DOC
第四章汇编语言程序设计(DOC)
第四章汇编语言程序设计 本章的汇编语言程序设计的主要内容有:
汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
汇编语言程序设计概述 1、计算机的汇编语言 以助记符表示的指令,每一条指令就是汇编语言的一条语句。
2、汇编语言的语句格式 MCS-51汇编语言的语句格式表示如下:
[]:
[];[] 标号:
指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
操作码:
规定语句执行的操作内容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:
给指令的操作提供数据或地址。
注释:
是对语句或程序段的解释说明。
分界符:
用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号用于标号之后 空格用于操作码和操作数之间 逗号用于操作数之间,分割两个以上的操作数分号用于注释之前。
ORG3000H3000HE8HDELY:
MOVA,R0;这是延时子程序 单片机汇编语言程序的结构形式 顺序结构;分支结构;循环结构1、顺序结构程序设计顺序程序是最简单的程序结构,在顺序程序中既无分支、循环,也不调用子程序,程序执行时一条一条地按顺序执行指令。
例:
三字节无符号数相加,被加数在内部RAM的50H、51H和52H单元中,加数在内部RAM的53H、54H和55H单元中,其中被加数单元和加数单元的高位地址存放的为最低位字节;要求把相加之和存放在50H、51H和52H单元中。
进位位存放在位寻址区的00H位中。
ADDU:
MOVR0,#52H;被加数的低字节地址MOVR1,#55H;加数的低字节地址MOVA,@R0 ;取被加数的最低位数据ADDA,@R1 ;与加数的最低字节相加 MOV@R0,A ;存低字节相加结果DECR0 ;地址减1DECR1 ;MOVA,@R0ADDCA,@R1 ;中间字节带进位相加MOV@R0,A ;存中间字节相加结果DECR0 ;地址减1DECR1MOVA,@R0ADDCA,@R1 ;高位字节带进位相加MOV@R0,A ;存高字节相加结果CLRA ;进位送00H位保存。
(对A清零)ADDCA,#00H ;MOV20H,A;进位位送入位地址00H RET 2、分支结构程序设计 程序分支是通过转移指令实现的,为清除起见,把分支程序分为以下几种情况。
单分支程序 单分支使用条件转移指令实现,即根据条件对程序的执行进行判断,满足条件则进行程序转移,否则程序顺序执行。
多分支程序 ⑴使用多条CJNE指令,通过连续比较,实现多分支程序转移。
⑵使用查地址表方法实现多分支程序转移。
⑶使用查转移指令表的方法实现多分支程序转移。
⑷通过堆栈操作实现多分支程序转移。
例:
有一温度控制系统,现场采集的温度值(Ta)放在累加器A中。
此外,在内部RAM54H单元存放控制温度下限值,在55H单元存放控制温度上限值。
若Ta>T55,则程序转向JW;若Ta 有关程序段如下:
CJNEA,55H,LOOP1; AJMPFHLOOP1:
JNCJW CJNEA,54H,LOOP2 AJMPFHLOOP2:
JCSWFH:
RETJW:
:
:
SW:
:
:
3、循环程序循环是为了重复执行一个程序段,MCS-51汇编语言中虽然没有专用的循环指令,但可以使用条件转移指令通过条件判断来控制循环是否结束。
MCS-51汇编语言的伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。
ORG汇编起始地址命令命令格式:
[]ORG 其中[]是选择项,根据需要选用。
项,通常为16位绝对地址,但也可以使用标号或表达式表示。
例如:
ORG8000H 8000H74H START:
MOVA,#00H8001H00H END汇编终止命令命令格式:
[]END[]END是汇编语言源程序的结束标志。
EQU(EQUate)赋值命令 命令格式:
EQU例:
DATA1EQU40H(用DATA1来表示40H单元,以后程序中出现DATA1就代表40H单元,但如何区分它是代表数据还是地址呢?
这主要看程序中的指令形式,如果是数据,则应加“#”即#DATA1, 否则为地址。
) 执行:
MOVA,DATA1;DATA1为片内的40H单元执行:
MOVA,#DATA1;DATA1为数据40H DB定义字节命令命令格式:
[]DB 例如:
存放七段数码管显示的十六进制数的字型码,可使用多条DB命令定义:
ORG8100H LED_TAB:
DBC0H,F9H,A4H,B0H DB99H,92H,82H,F8H DB80H,90H,88H,83H DBC6H,A1H,86H,84H (这些数据依次存放在8100H为起始地址的程序存储区中,它们是共阳极七段数码管的字型数据,把它们组成常数表格放在程序存储区) DW定义数据字命令命令格式:
[]DW (在本讲中我们介绍了汇编语言的格式,几种基本的程序结构格式,伪指令等,希望大家在课后的练习加以熟悉掌握。
) MCS-51单片机汇编语言程序设计举例 1、主程序:
顺序执行的无限循环的程序,运行过程处于全封闭状态。
例如:
带显示及键盘输入的某单片机系统的主程序框图结构为:
2、子程序:
完成某种特定功能的一个程序段,也称为一个程序模块。
作为子程序,要有以下约定:
子程序功能:
程序入口:
程序出口:
程序影响:
子程序功能:
完成三字节无符号数的加法。
程序入口:
50H、51H、52H为被加数,数据结构是50H为最高位 55H、54H、53H为加数,数据结构是53H为最高位程序出口:
50H、51H、52H为和值。
数据结构是50H为最高位,位地址00H为进位位。
程序影响:
R0、R1、R7、A ADDU:
MOVR0,#52H;被加数的低字节地址MOVR1,#55H;加数的低字节地址MOVR7,#3 ;三字节加法,循环次数为三次
CLRC ;清进位位LOOP:
MOVA,@R0 ;取被加数ADDCA,@R1 ;与加数相加MOV@R0,A ;存相加结果DECR0 ;地址减1DECR1 ;DJNZR7,LOOP;未完,继续MOV00H,C ;存进位位RET 例:
已知有数据3A59F0H+F687B2H,请利用以上程序完成加法运算。
并将和值送往片外RAM的50H,51H,52H单元。
,具体如下) MOV52H,#0F0H;送被加数 MOV51H,#59H MOV50H,#3AH MOV55H,#0B2H;送加数 MOV54H,#87H MOV53H,#0F6H LCALLADDU ;调用多字节加法子程序MOVR0,#50 ;和值送往外部RAMMOVR7,#03H LOOP:
MOVA,@R0MOVX@R0,AINCR0DJNZR7,LOOP:
:
(假设我们需要把运算结果送外部RAM保存,又如何呢?
对照程序的后半段予以说明。
) 3、中断服务程序:
中断服务程序是为了完成中断请求而编制的程序。
㈠算术运算程序 双字节无符号数乘法子程序例:
要进行两个双字节无符号数乘法运算,被乘数和乘数分别存放于内部RAM的R2,R3单元和R6,R7单元中,相乘结果依次存放在R4、 R5、R6、R7单元中。
R7*R3按照乘法规则,低8位放在寄存器A中,高8位放在寄存器B中,通过这两寄存器转存到R7和R5两个没有用过的寄存器中去,显然,R7就是终积的最低位的一个字节,R5是部分积的一部分;做完这个运算,我们来做R7*R2,结果仍然在A和B中,刚才我们已经有部分积在R5中,让R5和A相加,相加后的结果放到R4中,作为终积的一部分,并产生一个进位位,进位位和B相加,相加结果放到R5寄存器中,到这里,我们完成乘数低8位和被乘数的乘积运算结果,它们分别存放在R7、R4和R5中;下面我们来乘数的高8位与被乘数的16位相乘,这时,也是先R6*R3,乘积结果在A,B中,让R4和A相加,结果放到R6中,并产生进位位,R5和B相加,并考虑刚才的进位位,最后得到的结果放到R5中,并将进位位送F0,最后R6*R2,结果在B和A中,A与R5相加,结果继续放在R5中,进位送,最后是暂存的进位、B和辅助进位位相加结果存R4。
最后得到相乘的结果。
经过乘、加,乘、加的四个循环过程得到最后的结果。
)子程序功能:
双字节无符号数相乘 程序入口:
R2、R3为被乘数,R6、R7为乘数,程序出口:
R4、R5,R6、R7为乘积程序影响:
A、B、F0DBMUL:
MOVA,R3 MOVB,R7 MULAB ;R3*R7 XCHA,R7;原R7内容送A,R7←R3R7L,(在R7中得到乘积得最低字节) MOVR5,B ;R5←R3R7H MOVB,R2 MULAB ;R2*R7(得第二次部分积) ADDA,R5 ;R2R7L+R2R7H MOVR4,A ;R4←和 CLRA ADDCA,B ;R2R7H+(R2R7L+R5时产生的进位) MOVR5,A ;R5←和 MOVA,R6 ; MOVB,R3 MULAB ;R3*R6(得到第三次部分积) ADDA,R4 ;R3R6L+R4 XCHA,R6 ;A←R6,R6←R3R6L+R4(在R6中得到乘积的次低字节) XCHA,B ;A←R3R6H,B←R6 ADDCA,R5;R3R6H+R5+(R3R6L+R4时产生的进位) MOVR5,A;R5←和 MOVF0,C ;F0←进位 MOVA,R2 MULAB ;R2*R6(得第四次部分积) ADDA,R5 ;R2R6L+(R3R6H+R5时产生的进位) MOVR5,A ;在R5中得到终积的次高字节 CLRA MOV,C;累加器最高位←进位 MOVC,F0 ADDCA,B ;R2R6H+F0+ MOVR4,A ;在R4中得到终积的最高字节 RET (具体讲解对照乘法运算规则和具体图例,简要说明该段程序的意思,编制程序的过程是对单片机指令系统的熟悉过程,也是对过去学习过的相关知识的复习过程,是一种综合能力的体现,希望同学们尽快熟悉单片机程序的设计过程。
) 第四章MCS-51汇编语言程序设计――汇编语言程序设计举例 ㈡数值转换程序 1.十六进制数转换为ASCII码 ASCII码与十六进制数据之间的关系:
ASCII码字符:
00H~7FH (ASCII码字符共128个,我们要进行数值转换,就是要找出十六进制的数据到ASCII码之间的关系,) ASCII码与十六进制数据之间的关系:
0~9→30H~39H A~F→41H~46H (我们要进行十六进制数到ASCII码的转换,如果计算机处理的数据是0~9时,对应的ASCII码为30H~39H,是A~F时,找到的是41H~46H。
也就是说,如果计算机要把0送给打印机打印的时候,这时,你不能送0,而是30H,这样一种转换实际上有很多种方式,)转换方法:
⑴计算法:
0~9→+30H→→ASCII:
30H~39H A~F→+30H+07H→→ASCII:
41H~46H ⑵查表法:
建立ASCII代码表存入程序存储器中,通过程序将与转换码相对应的ASCII码从表格中找出。
例:
在内部RAM的hex单元中存有两位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两单元中。
D7D6D5D4 D3 D2D1D01100001 0 D2 Hex0011001 0 32H asc0100010 0 44H Asc+1 (假设我们把要转换的十六进制数为D2,按照要求将十六进制的2转换为ASCII码的32H,并放到asc单元,十六进制的D转换为ASCII码的44H存放于44H单元。
下面看程序编制过程,我们用子程序来完成)子程序功能:
完成堆栈区中SP所指单元中的低4位数据转换为ASCII码。
入口:
待转换数据放入堆栈区中的首地址单元。
出口:
转换后的数据放入堆栈区中的首地址单元子程序HASC:
DECSPDECSPPOPACCANLA,#0FHADDA,#7MOVCA,@A+PCPUSHACCINCSPINCSPRET ASCTAB:
DB”0,1,2,3,4,5,6,7”DB”8,9,A,B,C,D,E,F”或建立的ASCII表:
30H,31H,32H,33H,34H,35H,36H,37H38H,39H,41H,42H,43H,44H,45H,46H (首先,用两条堆栈减1指令,于我们的程序是子程序,供主程序或调用程序调用,在调用我们这个子程序时,要将断点处的地址压入堆栈,故作此操作)