版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式系统概论,单片机基础,汇编语言程序设计,教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。 教学重点:常用汇编语言程序设计方法。 教学难点: 分支程序、散转程序与子程序的设计,程序设计语言,机器语言 是一种用二进制代码“0”和“1”表示指令和数据最原始的程序设计语言,是计算机唯一能够识别和执行的语言。计算机能够快速识别立即执行。 汇编语言 是用助记符表示的面向机器程序设计语言,比机器语言直观、易懂、易用且便于记忆。汇编语言在交由计算机执行之前,必须将其翻译成机器语言,这一翻译过程称为“汇编”。 高级语言 是一种面向过程且独立于计算机硬件结构的通用计算机语言。高级语
2、言同样需要翻译成机器语言,这一过程称为“编译”或“解释”,这一编译或解释的程序称为“编译程序”或“解释程序”。高级语言功能强,但用较多的存储空间,执行时间长,故不适用于高速实时控制。,汇编语言规范,汇编语言由四部分组成 标号 :操作码 , 操作数 ;注释 标号段:以字母开头的1-8个字母和数字串组成,不能用助记符、伪指令和寄存器名,标号只有在需要时才设置。 操作码段:是指令或伪指令助记符,用来表示指令的操作性质,在指令中是必不可少的。 操作数段:给出参加运算(或其它操作)的数据或数据地址。可使用二(B)、十(D)、十六(H)进制码.也可用标号及表达式表示。 注释段:是本指令执行目的和所起作用的
3、说明。它不参加汇编。 例 HY1:MOV A , #08H ; #08H A (表示将立即数08H送到累加器A中),80C51汇编程序设计中常用的伪指令,在汇编程序对汇编语言编写的源程序进行汇编时,有一些控制汇编用的特殊指令不属于指令系统,不产生机器代码,称为“伪指令”。为编程提供方便。 1、ORG (Origin) 汇编起始指令 :用于规定目的程序在程序存储器中存放的起始地址。格式如下: 标号 操作码 操作数 ORG 表达式(exp) 注 exp必须是16位的地址值 2、END 汇编结束指令:表示程序已结束。 3、EQU (Equate) 赋值指令:把操作数段中的地址或数据赋值给标号,格式如
4、下: 标号 操作码 操作数 字符名称 EQU 数或汇编符号 例 AA EQU R1 ;R1与AA等值 则 MOV A, AA 指令与 MOV A,R1指令结果相同。,80C51汇编程序设计中常用的伪指令,4、DB (Define Byte)定义字节(* 8bit )指令:定义程序存储器中存放的若干个字节的数值或ASCII码字符,每个数或字符之间用(,)隔开,表示ASCII码时需用()或(“”)表示8位常数表,格式如下: 操作码 操作数 DB 字节常数或ASCII字符 例 ORG 1000H DB 76H,73,C,B,OACH 则 (1000H)76H (1001H)49H (1002H)43
5、H (1003H)42H (1004H)0ACH 5、DW (Define Word)定义字(* 16bit )指令:定义程序存储器中存放的若干个字(16位:先存高8位(PC低地址),后存低8位(PC高地址)的数据或ASCII码字符,格式如下: 操作码 操作数 DW 字常数或ASCII字符 例 ORG 2200H DW 1246H,7BH,10 则(2200H)12H (2201H)46H (2202H)00H (2203H)7BH(2204H)00H (2205H)0AH,80C51汇编程序设计中常用的伪指令,6、BIT 定义位地址指令:功能是把位地址赋予所规定的字符名称。格式如下: 标号
6、操作码 操作数 字符名称 BIT 位地址 例 ABC BIT P1.0 Q4 BIT P2.2 则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。 7、DATA 定义标号数值伪指令:将表达式指定的数据地址赋予规定的字符名称,该指令与EQU指令相似,只是,可先使用后定义,放于程序开头、结尾均可。其功能是给标号段中的标号赋予数值,格式如下: 标号 操作码 操作数 字符名称 DATA 表达式 例 MN DATA 2000H 汇编后,MN的值为2000H 8、DS 定义存储空间指令 :其功能是从指定地址开始保留DS之后表达式的值所规定的存储单元以备使用,格式如下: 操作码 操作数 DS 表达
7、式 例 ORG 500H DS 10H DB 4BH,FDH 汇编后,从500H开始保留16个单元不赋值,然后从511H开始给存储器赋值,(511H)=4BH,(512H)=FDH.,汇编可分成两种: 人工汇编 机器汇编 机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。,汇编,机器语言目标程序,汇编语言源程序,汇编程序,汇编,机器语言目标程序,汇编语言源程序,人工查指令机器码表,汇编语言及汇编过程,顺序程序设计,顺序结构程序是基本程序。程序按编写的顺序依次往下执行每一条指令,直到最后一
8、条。它能够解决某些实际问题,或成为复杂程序的子程序。 例:将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码09为30H39H。 解:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。,顺序程序设计,源程序如下: 地址 机器码 周期数 源程序 . ORG 0000H 22H 0000H 02 02 00 3 LJMP MAIN 21H MAIN: 20H 200H 78 22 1 MOV R0,22H . 202H 76 00 1 MOV R0,00H . 204H E5 20 1 MOV A,20H
9、 R0 22H 206H D6 1 XCHD A, R0 ;A和R0的低4位互换 207H 43 22 30 3 ORL 22H,#30H 20AH C4 1 SWAP A ;A的高低4位互换 20BH 44 30 1 ORL A,30H 20DH F5 21 1 MOV 21H,A 20FH 80 FE 2 SJMP $ ;循环等待 END,将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码09为30H39H。,循环程序设计,处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程
10、序,使程序缩短,节省存储单元。 循环初态:(初始条件)是设置循环过程中工作单元的初值,例如,设循环次数计数器、地址指针置初值等。 循环体:循环体是指重复执行的程序段,完成主要的计算和操作任务。同时包括对指针的修改。 循环控制部分:循环控制部分用于控制循环的执行和结束。根据循环次数计数器的状态或循环条件,检查循环是继续循环或退出循环。 若在循环体中还包含有循环程序,这种现象叫“循环嵌套”,这样的程序称为“多重循环程序”。在多重循环程序中,只允许外重循环嵌套内重循环,不允许循环体交叉;也不允许从循环程序外部跳入循环程序中。,顺序程序设计,已知:80C51单片机经常使用的晶振为12MHz,要求设计一
11、个软件延时程序,延时时间为10ms。 解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为12MHz,则可知一个机器周期为1s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:,循环程序设计,周期数 源程序 注释 1 MOV R0,0AH;10毫秒数R0 1 DL2: MOV R1,MT ;1ms延时的预定值MTR1(MTFAH) 1 DL1: NOP 1 NOP 2 DJNZ R1,DL1 ;lms延时循环 2 DJNZ R0,DL2 ;毫秒数减1,不等于
12、0,继续循环,等于 0结束 内层循环 DL1 机器周期个数为(1+1+2),每个机器周期为1s,内层循环一次需4s。若内层循环延时 lms,需1000/4=250次,十六进制数为FAH,循环程序设计,ORG 200H CLR A ;清A作为初始最大值 MOV R2,20H ;数据个数初值 MOV R1,22H ;数据存放区首地址 LP: CLR C ;清进位 SUBB A,R1 ;初始最大值减队列中的数 JNC NEXT ;小于初始最大值继续 MOV A, R1 ;大于初始最大值,则用此值作为最大值 SJMP NEXT1 NEXT:ADD A, R1 ;小于初始最大值,则恢复原最大值 NEXT
13、1:INC R1 ;修改地址指针 DJNZ R2,LP ;依次重复比较,直至R20 MOV 21H ,A ;最大值存入21H单元,从22H单元开始有一个无符号数据块,其长度在20H单元。求出数据块中最大值,并存入21H单元,多重循环设计,如果在一个循环程序中嵌套了其他的循环程序,称为多重循环程序。在用软件实现延时时显得特别有用。设计50ms秒延时子程序,使用12MHz晶振时,一个机器周期的时间为1 s,执行一条DJNZ指令的时间为2 s ,我们可以采用双重循环的方法写出延时的LOOP子程序,周期数 源程序 注释 1 LOOP: MOV R7,#C8H ;200 1 DEL1 :MOV R6,#
14、7CH ;123 1 NOP 2 DEL : DJNZ R6, DEL 2 DJNZ R7,DEL1 2 RET 延时时间:t=1+200(1+1+2*123)+2+2 50000 s=50ms,分支程序设计,分支程序的的特点是在程序中是含有转移指令,可根据程序要求,无条件或有条件地改变程序的执行顺序。 编写分支结构程序的重在于正确使用转移指令,转移指令有3种,即无条件转移、条件转移、散转 。 1、无条件转移:程序转移方向是事先安排的,只须给出正确的转移目标地址或偏移量即可。 2、条件转移:根据已执行程序对标志位、累加器、内部RAM的某位的影响结果来决定程序的走向。 例:JC rel ; (C
15、)1:(PC)2rel PC (跳转) (C)0:(PC)2PC (顺序执行) 在执行此命令之前,必须使用影响位累加器C的指令。 3、散转:在80C51单片机中有一条专门的散转指令。,无条件/条件转移程序,例:设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。 Y= 3X , X 15 函数式有3条路径可选,需采用分支程序设计。首先计算2X并暂存R1中,在第2条件中,2X最大值不大于30,故可用一个寄存器,然后根据X值确定Y值。,无条件/条件转移程序,ORG 200H MOV A,5AH ADD A,5AH ;2XA MOV R1,A MOV A,5AH ;重新把X装入
16、A CJNE A,#10,L1 L1:JC L2 ;X15 CJNE A,#10H,L3 ;与16比较 L3:JNC L4 ;X15转L4 MOV A,R1 ADD A,#10 ;10X15,Y2X10 MOV R0,A SJMP L4 L2: MOV A,R1 ADD A,5AH ;X10,Y=3X MOV R0,A L4: MOV 5BH,R0 ;存结果 SJMP $ END,Y= 3X , X 15 (5AH)=X (5BH)=Y,散转指令 JMP A+DPTR,散转指令的操作是把16位数据指针DPTR的内容与累加器A中8位无符号数相加,形成新的目标地址,装入程序计数器PC,此即散转的目
17、的地址。散转程序的设计采用两种不同的方法。 固定数据指针DPTR,根据累加器A的内容,转入相应的分支程序。(散转点不超过256个) 累加器A清0,根据数据指针DPTR的值决定程序转向地址,DPTR的值可通过查表或其他方法获得。(可达64KB地址空间转移),散转程序设计(采用转移指令表),根据R3的内容,转向各个操作程序。 R30, 转入OPR0 R31, 转入OPR1 . R3n, 转入OPRn 解:程序清单如下 MOV DPTR,TAB1 ; 跳转表首地址送数据指针 MOV A,R3 ADD A,R3 ;R32 A(修正变址值) JNC NOAD ;判有否进位 INC DPH ;有进位则加到
18、高字节地址 NOAD:JMP ADPTR ;(A)+(DPTR)PC转向形成的散转地址入口 TAB1:AJMP OPR0 ;转移到OPR0 AJMP OPR1 . AJMP OPRn 注意:各转移指令地址依次相差2字节,所以A中变址值必须乘2修正(AJMP 2字节指令 ; LJMP 3字节指令),散转程序设计(采用转向地址表),根据R2的内容,转入对应的操作程序。 解:设转移入口OPR0、OPR1 . OPRn MOV DPTR,TAB1 MOV A, R2 ADD A,R2 ;R22 A JNC NOAD ;判有否进位 C =0 跳转,C=1 顺序执行 INC DPH ;有进位C ,(DPH
19、)+1 DPH NOAD:MOV R3,A ;暂存 MOVC A ,ADPTR ;取地址高8位 (A)+(DPTR) A XCH A,R3 ;暂存转移地址高8位 INC A MOVC A,A+DPTR ;取地址低8位(A)+(DPTR) A MOV DPL,A ;置转移地址低8位 MOV DPH,R3 CLR A JMP ADPTR ; (A)+(DPTR) PC TAB1 DW OPR0 ;16位转移地址表的首地址 DW OPR1 . DW OPRn 注: DW (Define Word)定义字(* 16bit )指令:定义程序存储器中存放的若干个字(16位:先存高8位(PC低地址),后存低
20、8位(PC高地址),查表程序设计,所谓的“查表法”,就是预先将一些复杂的运算结果,以表格的形式存放在程序存储器中,当用户程序需要用到这些数据时,使用编排好的程序号将其读出,这种程序称为查表程序。 用于查表的指令有两条:MOVC A,APC; MOVC A,ADPTR(均为单字节指令) 当使用DPTR作为基址寄存器时查表比较简单,查表的步骤分三步 基址(表格首地址)送DPTR数据指针; 所查表索引值(在表中的位置是第几项)送累加器A; 执行查表指令 MOVC A,ADPTR,进行读数,查表结果送回累加器A。 当使用PC作为基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,查表时其
21、操作有所不同。查表的步骤也分三步: 使用传送指令把所查数据索引值送入累加器A。 使用 ADD A,#data 指令对累加器A进行修正。data值由下式确定。 PC + data = 数据表首地址 其中,PC是 MOVC A,A+PC 下一条指令的地址。因此,data值实际等于查表指令和数据表格之间的字节数 。 执行查表指令 MOVC A,APC 完成查表。 注意:MOVC A, A+DPTR 指令可以实现64K地址范围内的数据查寻,而MOVC A,A+PC指令只能实现256字节范围内的数据查寻。,规则变量的查表程序设计,如果数据表格中值位单字节,且表格占有的单元数少于256,则查表方法比较简单
22、。 例 设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。 ORG 30H 30H MOV A,R0 31H ANL A,0FH ;保留低4位 33H ADD A,2 ;变址调整 35H MOVC A,APC;查表获取ASCII码值 36H MOV R0,A 37H RET 38H TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H DB 39H,41H,42H,43H,44H,45H,46H,子程序结构与设计,子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情
23、况,如果重新书写这个程序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间。 要给每个子程序赋一个名字,实际是一个入口地址代号。 要正确地传递函数,首先要有入口条件(入口参数),说明进入子程序时处理的数据如何得到(从累加器A 、寄存器R0-R7等处);还要有出口条件(出口参数),即处理的结果是如何存放的。 注意保护现场和恢复现场。在执行子程序时,可能使用到累加器A或工作寄存器,所以在执行子程序前,应将这些内容保存起来,即保护现场。当子程序执行完,返回到主程序之
24、前,在将这些内容取出送回到累加器A或原来的寄存器中,这一过程称为恢复现场。,子程序调用与返回,主程序调用子程序是通过子程序调用命令“LCALL add16”和”ACALL add11”来实现的。前者称为”长调用指令“,给出16位子程序首地址,后者称为”绝对调用指令“,给出的操作数是子程序低11位入口地址,和程序计数器PC高5位合在一起,构成16位转移地址。 子程序调用指令功能是将PC中的内容(下一条指令的地址,称为”断点“)压入堆栈(保护断点)。然后将调用地址送入PC,使程序转入子程序的入口地址。 子程序的返回是通过返回指令RET实现的。该指令的功能是将堆栈存放的返回地址(即断点)弹出堆栈,并
25、送回到PC中,使程序继续从断点处执行。 在主程序中,不希望被子程序更改内容的寄存器在调用前,在主程序中安排压栈指令来保护现场;子程序返回后,再安排弹出指令恢复现场。 在需要保护现场的程序中,要正确地设置堆栈指针。,子程序设计,1、子程序的定义 子程序名:. ;子程序开始 RET ;子程序结束 注:子程序名由用户定义,以字母开头,2 、子程序的调用 在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。 调用子程序的指令: ACALL 子程序名:短调用(2KB范围内) LCALL 子程序名:长调用(64KB范围内),子
26、程序嵌套,子程序嵌套是指在子程序执行过程中,还可以调用另一个子程序。子程序的嵌套在理论上是无限的,但实际上由于受到堆栈深度的限制嵌套的次数是有限的。 子程序调用指令功能是将PC中的内容(下一条指令的地址,称为”断点“)压入堆栈(保护断点)。然后将调用地址送入PC,使程序转入子程序的入口地址。(先入栈PC低8位,再入栈PC高8位) 子程序的返回是通过返回指令RET实现的。该指令的功能是将堆栈存放的返回地址(即断点)弹出堆栈,并送回到PC中,使程序继续从断点处执行。(先出栈PC高8位,再出栈PC低8位) 在子程序嵌套过程中可以看出,堆栈在子程序调用中是必不可少的,因为断点地址均是按照“先进后出”的
27、原则存入堆栈的,从而保证了存入的断点地址能依次正确地返回。,子程序设计,子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情况,如果重新书写这个程序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间。 编制程序实现c=a2+b2(a, b均为1位十进制数) 计算某数的平方可采用查表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。,编制程序实现c=a2+b2(a, b均为1位十进制数),计算某数的平方可采用查
28、表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。设a, b分别存放于片内RAM的30H, 31H两个单元中,结果c存放于片内RAM的40H单元。程序流程图如图所示。,ORG 0200H 0200H SR: MOV SP,#4FH ; 设堆栈指针 0203H MOV A, 30H; 将30H中的内容a送入A 0205H LCALL SQR; 转求平方子程序SQR处执行 0208H MOV R1, A; 将a2结果送R1 0209H MOV A, 31H; 将31H中的内容b送入A 020BH LCALL SQR; 转求平方子程序SQR处执行 020EH ADD A, R1; a2+b2结果送A 020FH MOV 40H, A; 结果送40H单元中 0211H SJMP $ ; 程序执行完,“原地踏步” 求平方子程序如下(采用查平方表的方法): ORG 0400H 0400H SQR:INC A 0401H MOVC A, A+PC ;单字节指令 0402H RET 0403H TAB:DB 0, 1, 4, 9, 16 , 25, 36, 49, 64, 81 040CH END,编制程序实现c=a2+b2,(30H)=a,(31H)=b,(40H)=c,综合程序举例(代码转换类),将R0所指出单元中的ASCII码转换成十六进制数,并
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025五年级教师述职报告(32篇)
- 招聘专员转正述职报告(3篇)
- IEC 62933-4-4 标准中文版文档(资深行业深度解读+资源指引)
- 甘肃省酒泉市肃州区2025-2026学年七年级下学期7月期末历史试卷
- 2026-2027学年第一学期高二年级立德树人德育实践课件:学校德育工作年度总结
- 保险营销团队高效的追踪体系关键点原则技巧
- 2026年九年一贯制学校德育工作汇报课件:德育主题活动设计与实施
- 第1课时 用直接开平方法解一元二次方程
- 16.2 整式的乘法(第2课时)
- 分子杂交精美生物医学
- 2026年患者投诉处理与沟通技巧课件(高清可编辑课件)
- 1.2小学科学苏教版(新教材)六年级上册第一单元第2课《燃烧与空气》课件(含AI赋能)
- 北森测评题库及答案2026
- 游乐设备设计中的人体工程学应用
- 高中数学必修二(人教A版2019)课后习题答案解析
- 《兽医基础》教案
- 新概念英语第二册单词表默写纸
- (完整)AED的使用课件
- 《成人高等教育本科生学士学位英语水平考试大纲(非英语专业)》
- 12SS508《混凝土模块式室外给水管道附属构筑物》
- 23J916-1:住宅排气道(一)
评论
0/150
提交评论