




已阅读5页,还剩72页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 汇编语言程序设计,单片机原理与接口技术,2,4.1 汇编语言程序设计概述,程序设计语言可分为:机器语言、汇编语言和高级语言。1.机器语言 二进制代码表示的指令、数字和符号称为机器语言。 缺点:不易懂,难记忆,易出错。,3,2.汇编语言 用英文助记符来表示的指令称为符号语言或汇编语言。将汇编语言程序转换成为机器语言的过程称为汇编。汇编语言特点:面向机器的语言,编程员须对51单片机的硬件有相当深入的了解。效率高,占用ROM小,运行速度快。能直接管理和控制硬件设备,能处理中断,能直接访问存储器及I/O接口等。汇编语言和机器语言都要针对具体硬件,通用性差。,4,3.高级语言Basic、Delphi以及C语言等,擅长于科学计算。优点:通用性强,直观、易懂、易学,可读性好。可使用C(C51)、PL/M语言对单片机应用程序进行设计。 对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。C语言和汇编语言混合编程 在需要即直接控制硬件,又要进行复杂计算的场合,可考虑采用C语言和汇编语言混合编程。,5,汇编有两种形式:手工汇编和机器汇编。当使用机器汇编时,必须让汇编程序知道哪些是指令,哪些是数据,程序的开始和结束等等。这就需要加入控制汇编的指令伪指令。经汇编形成机器码后,伪指令即失效,伪指令在汇编时并不产生任何机器代码。功能:用来对汇编过程进行指示和控制,便于简化汇编语言程序的编制和阅读。,4.2 伪指令,6,1. 起始汇编 ORG Origin 格式:ORG 16位地址指明程序或数据块的起始地址,用在每段源程序或数据块的开始。若缺省ORG,则汇编得到的机器码紧接在上一段代码之后开始。程序中可多次使用ORG,但地址必须是从小到大,不能交叉也不能重叠。,7,2. 结束汇编 END 格式:ENDEND是汇编语言源程序的结束标志,用于终止源程序的汇编工作,一般放到所有指令的最后。整个源程序中只能有一条END命令。若后面还有程序段,则不进行汇编。,8,3. 赋值 EQU Equate格式: 字符名称 EQU 数字或汇编符号功能:将右边的值赋给左边的字符。 右边可以是字节、字。 赋值的字符在源程序中可作为数值或地址使用。例:N EQU 30HLED EQU 40H MOV A,N ;(30H)A MOV A,#LED ; 40HA MOV A,LED;(40H)A,9,4. 定义字节 DB Define byte 格式:标号:DB数据或表格功能:把数据或表格依次存入从标号开始的连续字节单元。十进制则转为十六进制,字母转为ASCII码。例: ORG 1000HFIRST: DB DB 73H,01H,91H,07H,10,4. 定义字节 DB Define byte 格式:标号:DB数据或表格功能:把数据或表格依次存入从标号开始的连续字节单元。十进制则转为十六进制,字母转为ASCII码。例: ORG 1000HFIRST: DB 73H,01H,91H,07HSECOND:DB 02H,00H,19H,7lH,11,4. 定义字节 DB Define byte 格式:标号:DB数据或表格功能:把数据或表格依次存入从标号开始的连续字节单元。十进制则转为十六进制,字母转为ASCII码。例: ORG 1000HFIRST: DB 73H,01H,91H,07HSECOND:DB 02H,00H,19H,7lHTABLE: DB 96,40H,C,7,1101B,12,5. 定义字 DW Define word 格式:标号: DW 数据或表格功能:同DB,每个字要占两个单元,高8位先存,低8位后存。例: ORG 1000H DW 3450H,0060H,12,C程序汇编结果:,13,6. 数据地址赋值 DATA 格式:字符名称 DATA 表达式功能:类似于EQU,常用来定义数据地址,该语句可放在程序开头或末尾。例如:BUFFER DATA 20H赋值后的符号可以在源程序中代替DATA后面的字节地址,便于阅读。MOV A,BUFFER;(20H) AMOV A,#BUFFER; 20H A,14,7. 定义存储空间 DS Dfine storage 格式:标号: DS 表达式功能:从指定单元开始,保留由表达式指定的若干字节空间作为备用空间。 例: ORG 1000H DS 0AH DB 71H,11H,21H,15,8. 位地址赋值 BIT 格式:标号 BIT 位地址功能:将位地址赋给标号,类似DATA。赋值后的符号可以在源程序中代替BIT后面的位地址,便于阅读。例: FLG BIT ACC.0 ;0E0H AI BIT P1.0 ;90H START BIT 20H STOP BIT 21H,16,除了这些基本伪指令之外,还有一些高性能的汇编程序,可在汇编时进行表达式赋值、条件汇编和宏汇编。表达式赋值可允许汇编语言程序使用表达式,例如:“ADD A,#ALFA*BETA/2”,其中ALFA和BETA是两个已定义的标号。条件汇编可使用户在汇编时根据需要对源程序进行汇编,这样有利于程序的调试。宏汇编:一条宏指令往往包括若干条汇编语言指令,这样在使用宏指令之后可使源程序缩短,简化程序设计。使用宏指令之前要先对相应的寄存器赋值,否则出错。,17,4.3 汇编语言语句的格式51单片机汇编语言的四分段格式:标号字段 操作码字段 操作数字段 注释字段 ORG 0000H START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#00000011B ;3R2 LOOP: ADD A,R2 ;(A)+(R2)A DJNZ R1,LOOP ;R1内容减1不为零则循环 NOP HERE: SJMP HERE END,18,基本语法规则:1.标号字段用符号表示语句所在地址,即地址标号标号后边必须跟以冒号“ : ” 由18个ASCII字符组成(字母开头,字符和数字)地址标号在程序中必须唯一不能使用汇编语言已经定义的符号作为标号 2.操作码字段是汇编语言不可缺少的部分。,19,3.操作数字段 指令通常是单操作数、双操作数和无操作数三种情况。操作数之间,要以逗号隔开。(1)十六进制、二进制和十进制形式的操作数表示 二进制:后缀“B” ,Binary 。十进制:后缀“D”,Decimal,也可省略。十六进制:后缀“H” ,Hex。若十六进制操作数以字符AF开头时,要在它前面加 “0”,以便在汇编时与字符AF区别开来。(2)工作寄存器和特殊功能寄存器的表示即可用符号来表示,也可用地址来表示。 例如,累加器可用A(或Acc)表示,也可用0E0H来表示。,20,(3) $符号的使用用于表示转移指令操作码所在的地址。例如: JNB F0,$与 HERE:JNB F0,HERE 等价 再如: LOOP:SJMP LOOP可写为 SJMP $4.注释字段 必须以分号“;”隔开,换行书写时也要以分号“;”开头。 汇编时注释字段不会产生机器代码。,21,4.4 汇编语言程序设计基本结构,51单片机的编程可以是汇编语言也可以是C语言。C语言编程快捷,但形成的机器代码长,占用存储空间大,执行慢;汇编语言产生的机器码简短,占用存储空间小,执行快,能发挥单片机硬件功能。无论是C语言还是汇编语言,源程序都要转换成机器码单片机才能执行。汇编语言程序的结构:顺序程序结构:程序依次执行各条指令分支程序结构:程序依次执行指令,根据条件跳转循环程序结构:单循环、多循环、嵌套循环子程序结构:设计成通用程序块可被其它程序调用,22,4.4.1 顺序程序设计顺序结构简单、基本。特点: 程序从第一条一直顺序执行到最后一条指令。例1 有两组压缩BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,编写求和程序,把和存入43H、42H单元中。(高位在前,低位在后)分析:没有BCD码求和指令,需用二进制加法后再十进制调整。,23,ORG 0000HMOV A,22H ;取低位ADD A,32H ;求和DA A ;十进制数调整MOV 42H,A ;存低位MOV A,23H ;取高位ADDC A,33HDA AMOV 43H,A ;存高位SJMP $END,24,例2 求双字节补码。原数存放于R4、R5中,R5存低8位。分析:假设此双字节数为负数,需将原数取反加一即可。 MOV A,R5 ;取低位字节 CPL A ;取反操作 ADD A,#01H ;加1操作 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#00H MOV R4,A SJMP $,25,4.4.2 分支程序设计根据判断条件执行相应程序。单分支、多分支。例3 x、y均为有符号字节变量,分别存放在VAR和FUNC单元。编写按照下式要求给y赋值的程序。 1 x 0 y = 0 x = 0 -1 x 0则转移到POSIMOV A, #0FFH ;若X0 时A=1COMP:MOV FUNC, A ;存函数Y值SJMP $ ;结束程序END,27,4.4.3 循环程序设计对某一程序段循环重复执行若干次。特点:可缩短程序代码,提高运行速度。分为先循环后判断和先判断后循环两种循环体方式。,例4 已知内部RAM从ADDR1为起始地址的数据块存放无符号数,块长在LEN单元内,编程求出数据块中的最大值并存入MAX单元。,28,程序清单:ADDR1 DATA 50HLEN DATA 30HMAX DATA 32H MOV MAX,#00H ;MAX单元清零 MOV R1,#ADDR1 ;ADDR1送R1LOOP:MOV A,R1 ;数据块中数送入A CJNE A,MAX,NEXT1 ;A和(MAX)比较NEXT1:JC NEXT ;若A(R1), 则转移MOV MAX, R1 ;若(MAX)X2则交换,否则不交换;. 最后拿Xn-1与Xn同样原则比较。 当第一次大循环结束后,排在Xn的即为最大值。 用同样的方法再进行第二次大循环,得到次最大值Xn-1。 n个数需要n-1次大循环。 R7为比较次数计数器,初值为7,F0为数据互换标志位。 在某次循环中没有交换,位F0=0,则结束排序。,51,START:CLR F0;互换标志清0 MOV R7,#07H;各次冒泡比较次数 MOV R0,#30H;数据区首址LOOP: MOV A,R0;取前数 MOV 2BH,A;暂存前数 INC R0 MOV 2AH,R0;取后数 CLR C SUBB A,R0;前数减后数 JC NEXT;前数小于后数,不互换 MOV R0,2BH DEC R0 MOV R0,2AH;两数交换 INC R0;准备下一次比较 SETB F0;置互换标志NEXT: DJNZ R7,LOOP;进行下一次比较 JB F0,START;进行下一轮冒泡 RET,52,例13 设51单片机使用12MHz晶振,试设计100ms的延时程序。程序如下:ORG 1000HDELEY:MOV R6,#Y ;1sLOOP1:MOV R7,#X ;1s NOP ;1sLOOP2:DJNZ R7,LOOP2 ;2s DJNZ R6,LOOP1 ;2s RET,内循环:1+1+X*2T=498 (取)则x248外循环:1+(498+2)YT=105则Y=(105-1)/500200实际延迟时间:1+(498+2)200 =100.001 ms,53,4. 散转程序例14 根据R0中的内容,分别转向各个处理程序。程序如下:LP0: MOV DPTR,#TAB MOV A, R0 ADD A, R0 ;R0内容乘以2 JNC LP1 ;无进位转移 INC DPH ;加进位位LP1: JMP A+DPTR ;跳至散转表中相应位置TAB:AJMP PRG0;2字节AJMP PRG1 AJMP PRGn,54,4.5 综合编程举例例1 假定被乘数在(R4 R3)中,乘数放在R2中,乘积放在R7 R6和R5中。多字节无符号数乘法可表示为:(R4R3)(R2)=(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)由此可编写如下程序:,55,NMUL1:MOV A, R2MOV B, R3MUL AB ;(R3)(R2)MOV R5, A ;积的低字节送R5MOV R6, B ;积的高字节送R6MOV A, R2MOV B, R4MUL AB ;(R4)(R2)ADD A, R6 ;(R3)(R2)的高位加(R4)(R2)的低位MOV R6, AMOV A, BADDC A, #00H ;(R4)(R2)的高位加CyMOV R7, A ;结果送R7RET,56,例2 双字节无符号数乘法子程序设计。算法:两个双字节无符号数分别放在R7、R6和R5、R4中。由于51单片机指令中只有8位数的乘法指令MUL,用它来实现双字节数乘法时,可把乘数分解为:(R7)(R6) = (R7) 28 + (R6) ; (R5)(R4) = (R5) 28+(R4)则这两个数的乘积可表示为: (R7)(R6)(R5)(R4) = (R7) 28 + (R6) (R5) 28 + (R4) = (R7) (R5) 216 + (R7) (R4) + (R6) (R5) 28 + (R6) (R4) = (R04) (R03) (R02) (R01)显然,我们将(R6)(R4)放入(R02) (R01)中,将(R7)(R4)和(R6)(R5)累加到(R03) (R02)中,再将(R7)(R5) 累加到(R04)(R03)中即可得到乘积结果。,57,入口:(R7 R6)=被乘数,(R5 R4)=乘数,(R0)=乘积的低位字节地址指针。出口:(R0)=乘积的高位字节地址指针,指向32位积的高8位。工作寄存器:R3、R2存放部分积,R1存放进位位。程序清单如下:,58,MUL1:MOV A,R6 ;取被乘数的低字节到A MOV B,R4 ;取乘数的低字节到B MUL AB ;(R6)(R4) MOV R0,A ;R01存乘积低8位 MOV R3,B ;R3暂存(R6)(R4)的高8位 MOV A,R7 ;取被乘数的高字节到A MOV B,R4 ;取乘数的低字节到B MUL AB ;(R7)(R4) ADD A,R3 ;(R7)(R4)低8位加(R3) MOV R3,A ;R3暂存28部分项低8位 MOV A,B ;(R7)(R4)高8位送A,59,ADDC A,#00H ;(R7)(R4)高8位加进位位CY MOV R2,A ;R2暂存28部分项高8位 MOV A,R6 ;取被乘数的低字节到A MOV B,R5 ;取乘数的高字节到B MUL AB ;(R6)(R5) ADD A,R3 ;(R6)(R5)低8位加(R3) INC R0 ;调整R0地址为R02单元 MOV R0,A ;R02存放乘积158位结果 MOV R1,#00H ;清暂存单元 MOV A,R2 ADDC A,B ;(R6)(R5)高8位加(R2)与CY MOV R2,A ;R2暂存28部分项高8位 JNC NEXT ;28项向216项无进位则转移 INC R1 ;有进位则R1置1标记,60,NEXT:MOV A,R7 ;取被乘数高字节 MOV B,R5 ;取乘数高字节 MUL AB ;(R7)(R5) ADD A,R2 ;(R7)(R5)低8位加(R2) INC R0 ;调整R0地址为R03单元 MOV R0,A ;R03存放乘积2316位结果 MOV A,B ADDC A,R1 ;(R7)(R5)高8位加28项进位 INC R0 ;调整R0地址为R04单元 MOV R0,A ;R04存放乘积3124位结果 RET,61,例3 将双字节二进制数转换成BCD码(十进制数)。分析:将二进制数转换成BCD码的数学模型为: (a15a14a1a0)2=(a15215+a14214+a121+a020)10上式右侧即为欲求的BCD码。它可作如下变换 (a15214+a14213+a1)2+a0括号里可变为:(a15213 +a14212+a13211+a2)2+a1括号里可变为:(a15212+a14211+a13210+a3)2+a2 经过16次的变换后,括号里的内容可变为: (02+a15)2+a14括号里的内容的通式为ai+12+ai (i=015),即为二进制数转换成BCD码的公因式。,62,在程序设计中,可利用同数相加(乘以2)实现ai+12,采用循环计算16次公因式的方法来完成二进制数到BCD码的转换。入口参数:16位无符号数送R3, R2。出口参数:共有5位BCD数,万位R6;千、百位R5;十、个位R4位。程序流程图如右图所示。,63,程序如下: ORG 1000HBIN2BCD:CLR A;A清0 MOV R4, A;清0出口参数寄存器 MOV R5, A;入口:R3,R2 MOV R6, A;出口:R6,R5,R4 MOV R7, #10H;设置循环次数16LOOP: CLR C MOV A, R2;ai+12 RLC A MOV R2, A MOV A, R3 RLC A MOV R3, A,64,MOV A, R4 ADDC A, R4 ;带进位自身相加,相当于乘2加aiDA AMOV R4, AMOV A, R5ADDC A, R5DA AMOV R5, AMOV A, R6ADDC A, R6MOV R6, A ;万位数不超过6,不用调整DJNZ R7, LOOP ;若16位未循环完继续循环RET,65,例4 双字节无符号数除以单字节数入口条件:被除数在R4、R5(低字节)中,除数在R7中。出口信息:OV=0时,单字节商在R3中,OV=1时溢出。影响资源:PSW、A、R3R7堆栈需求:2字节,66,DIV42:CLR C ;比较被除数和除数MOV A,R4SUBB A,R7JC DV50SETB OV ;商溢出RETDV50:MOV R6,#8 ;R4R5/R7R3 DV51:CLR C MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV F0,C ;保存溢出位 CLR CSUBB A,R7,ANL C,/F0JC DV52MOV R4,ADV52:CPL CMOV A,R3RLC AMOV R3,ADJNZ R6,DV51MOV A,R4 ;四舍五入ADD A,R4JC DV53SUBB A,R7JC DV54DV53:INC R3DV54:CLR OVRET,67,例5 双字节无符号数除法DIV AB是单字节除法。多字节无符号数的除法可用“移位相减”来完成。除法运算是按位进行的,每一位一个循环,每个循环中做三件事:被除数左移一位,移出的位移入余数寄存器,余数减除数,是否够减来置商为“1” 或“0” 。16位的被除数要循环16次来完成除法运算。若除数为零,置溢出标志为“1”。移位是把被除数向余数左移,把被除数左移后空出的低位存放商数,当除法完成后,被除数已全部移到余数单元并逐次被减而得到余数,而被除数中内容即为商数。,68,R7(高字节)R6程序执行前为被除数,执行后为最终商数;R5(高字节)R4存除数;R3(高字节)R2每次相除后的余数,执行后为最终余数;R1循环次数计数器(被除数的位数) ;F0溢出标志。双字节无符号数除法程序如下:,69,DIV22:CLR F0 ;清溢出标志 MOV A,R5 JNZ ZERO ;除数不为零,转ZERO MOV A,R4 JZ OVER ;除数为零,转溢出处理ZERO:CLR A ;余数单元清“0”MOV R2,AMOV R3,A MOV A,R7JNZ START ;被除数高字节不为零,开始除法运算MOVA,R6JNZSTART ;被除数高字节为零,低位字节不为零,开始除法运算RET ;被除数为零,则商和余数均为零,结束。,70,START:MOV R1,#10H ;设循环计数器LOOP:CLR C ;进行一位除法运算MOV A,R6 ;被除数左移一位RLC A MOVR6,AMOVA,R7RLCAMOVR7,AMOVA,R2 ;移出的被除数高位移入余数R3,R2RLCAMOVR2,AMOVA,R3RLCAMOVR3,AMOVA,R2 ;余数低字节减除数低字节,71,CLRCSUBBA,R4;JCNEXT ;余数小于除数,则继续下一位除法MOVR0,A ;暂存余数低字节MOVA,R3 ;再比较余数与除数的高字节SUBBA,R5JCNEXT ;余数小于除数,则继续下一位除法INCR6 ;余数大于除数,则商加1MOVR3,A ;相减结果送入余数单元MOVA,R0MOVR2,ANEXT:DJNZR1,LOOP ;16次循环未结束则继续RETOVER:SETB F0 ;除数为零,溢出标志为“1”RET,72,例6 已知30H单元存有一位BCD码,将其转换为共阴显示的字形码,然后从P1口输出。分析:设这些字形码存放在标号为TABLE的存储单元。 ORG 0000H AJMP MAIN ORG 0100HMAIN:MOV DPTR,#TABLE ;字形码表首地址 MOV A,30H ;取数 MOVC A,A+DPTR ;查表取值送A MOV P1,A ;字形码送P1 SJMP $TABLE:DB 3FH,06H,5BH,4FH,66H ;04共阴字形码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度农村涵洞改造施工合同
- 2025版导游领队带团全程服务合同范本
- 2025版建筑消防技术咨询服务与改造协议
- 二零二五年度脚手架施工工程结算与支付合同
- 2025版汽车融资租赁车辆租赁合同模板修订版
- 二零二五年度货物运输保险协议:物流企业货物保险合同
- 二零二五年场部保密协议及保密信息保密义务履行监督合同
- 2025版江苏智能交通系统工程合同
- 2025版汽车租赁公司车辆股份买卖合作协议
- 2025版婚礼化妆服务及产品销售合同
- 2025年医院血透室试题(含答案)
- 2025至2030聚乙烯醇缩丁醛(PVB)树脂行业发展趋势分析与未来投资战略咨询研究报告
- 2025年小学语文教师考试题库含答案
- 船舶安全教育培训内容
- 新能源并网技术规范-洞察及研究
- 产品生态设计管理办法
- 2025年贵州省中考数学试卷及答案
- 安全生产责任保险事故预防服务方案
- 2025年第十届全国中小学“学宪法、讲宪法”知识竞赛题库
- 学堂在线 积极心理学(上)厚德载物篇 章节测试答案
- 上海市徐汇、松江、金山区2025届高二下化学期末综合测试试题含解析
评论
0/150
提交评论