分享
分享赚钱 收藏 举报 版权申诉 / 35

类型《嵌入式系统概论-单片机基础》单片机之汇编语言1.ppt

  • 上传人:dzzj200808
  • 文档编号:3356995
  • 上传时间:2018-10-17
  • 格式:PPT
  • 页数:35
  • 大小:411KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    《嵌入式系统概论-单片机基础》单片机之汇编语言1.ppt
    资源描述:

    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 1000HDB 76H,73,C,B,OACH 则 (1000H)76H (1001H)49H (1002H)43H (

    5、1003H)42H (1004H)0ACH 5、DW (Define Word)定义字(* 16bit )指令:定义程序存储器中存放的若干个字(16位:先存高8位(PC低地址),后存低8位(PC高地址)的数据或ASCII码字符,格式如下: 操作码 操作数DW 字常数或ASCII字符 例 ORG 2200HDW 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 表达式 例 ORG 500

    7、HDS 10HDB 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 21HMAIN: 20H 200H 78 22 1 MOV R0,22H . 202H 76 00 1 MOV R0,00H . 204H E5 20 1 MOV A,20H R0 22H 206H D6 1

    9、 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,要求设计一个软件延时程序,延时时间为10ms。

    11、 解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为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,不等于0,继续循环,等于0结束 内层循环

    12、DL1 机器周期个数为(1+1+2),每个机器周期为1s,内层循环一次需4s。若内层循环延时 lms,需1000/4=250次,十六进制数为FAH,循环程序设计,ORG 200HCLR 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 ;小于初始最大值,则恢复原最大值 NEXT1:INC R1 ;修改地址指针DJNZ R2,LP

    13、;依次重复比较,直至R20MOV 21H ,A ;最大值存入21H单元,从22H单元开始有一个无符号数据块,其长度在20H单元。求出数据块中最大值,并存入21H单元,多重循环设计,如果在一个循环程序中嵌套了其他的循环程序,称为多重循环程序。在用软件实现延时时显得特别有用。设计50ms秒延时子程序,使用12MHz晶振时,一个机器周期的时间为1 s,执行一条DJNZ指令的时间为2 s ,我们可以采用双重循环的方法写出延时的LOOP子程序,周期数 源程序 注释 1 LOOP: MOV R7,#C8H ;200 1 DEL1 :MOV R6,#7CH ;123 1 NOP 2 DEL : DJNZ R

    14、6, DEL 2 DJNZ R7,DEL1 2 RET 延时时间:t=1+200(1+1+2*123)+2+250000 s=50ms,分支程序设计,分支程序的的特点是在程序中是含有转移指令,可根据程序要求,无条件或有条件地改变程序的执行顺序。 编写分支结构程序的重在于正确使用转移指令,转移指令有3种,即无条件转移、条件转移、散转 。 1、无条件转移:程序转移方向是事先安排的,只须给出正确的转移目标地址或偏移量即可。 2、条件转移:根据已执行程序对标志位、累加器、内部RAM的某位的影响结果来决定程序的走向。 例:JC rel ; (C)1:(PC)2rel PC (跳转)(C)0:(PC)2P

    15、C (顺序执行) 在执行此命令之前,必须使用影响位累加器C的指令。 3、散转:在80C51单片机中有一条专门的散转指令。,无条件/条件转移程序,例:设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。 Y= 3X , X 15 函数式有3条路径可选,需采用分支程序设计。首先计算2X并暂存R1中,在第2条件中,2X最大值不大于30,故可用一个寄存器,然后根据X值确定Y值。,无条件/条件转移程序,ORG 200HMOV A,5AHADD A,5AH ;2XA MOV R1,AMOV A,5AH ;重新把X装入ACJNE A,#10,L1L1:JC L2 ;X15CJNE A,

    16、#10H,L3 ;与16比较L3:JNC L4 ;X15转L4MOV A,R1ADD A,#10 ;10X15,Y2X10MOV R0,ASJMP L4 L2: MOV A,R1ADD A,5AH ;X10,Y=3XMOV R0,A L4: MOV 5BH,R0 ;存结果SJMP $END,Y= 3X , X 15 (5AH)=X (5BH)=Y,散转指令 JMP A+DPTR,散转指令的操作是把16位数据指针DPTR的内容与累加器A中8位无符号数相加,形成新的目标地址,装入程序计数器PC,此即散转的目的地址。散转程序的设计采用两种不同的方法。 固定数据指针DPTR,根据累加器A的内容,转入相

    17、应的分支程序。(散转点不超过256个) 累加器A清0,根据数据指针DPTR的值决定程序转向地址,DPTR的值可通过查表或其他方法获得。(可达64KB地址空间转移),散转程序设计(采用转移指令表),根据R3的内容,转向各个操作程序。 R30, 转入OPR0 R31, 转入OPR1 . R3n, 转入OPRn 解:程序清单如下MOV DPTR,TAB1 ; 跳转表首地址送数据指针MOV A,R3ADD A,R3 ;R32 A(修正变址值)JNC NOAD ;判有否进位INC DPH ;有进位则加到高字节地址 NOAD:JMP ADPTR ;(A)+(DPTR)PC转向形成的散转地址入口 TAB1:

    18、AJMP OPR0 ;转移到OPR0AJMP OPR1AJMP OPRn 注意:各转移指令地址依次相差2字节,所以A中变址值必须乘2修正(AJMP 2字节指令 ; LJMP 3字节指令),散转程序设计(采用转向地址表),根据R2的内容,转入对应的操作程序。 解:设转移入口OPR0、OPR1 . OPRnMOV DPTR,TAB1 MOV A, R2ADD A,R2 ;R22 AJNC NOAD ;判有否进位 C =0 跳转,C=1 顺序执行INC DPH ;有进位C ,(DPH)+1 DPH NOAD:MOV R3,A ;暂存MOVC A ,ADPTR ;取地址高8位 (A)+(DPTR) A

    19、XCH A,R3 ;暂存转移地址高8位INC AMOVC A,A+DPTR ;取地址低8位(A)+(DPTR) AMOV DPL,A ;置转移地址低8位MOV DPH,R3CLR AJMP ADPTR ; (A)+(DPTR) PC TAB1 DW OPR0 ;16位转移地址表的首地址DW OPR1 DW OPRn 注: DW (Define Word)定义字(* 16bit )指令:定义程序存储器中存放的若干个字(16位:先存高8位(PC低地址),后存低8位(PC高地址),查表程序设计,所谓的“查表法”,就是预先将一些复杂的运算结果,以表格的形式存放在程序存储器中,当用户程序需要用到这些数据

    20、时,使用编排好的程序号将其读出,这种程序称为查表程序。 用于查表的指令有两条:MOVC A,APC; MOVC A,ADPTR(均为单字节指令) 当使用DPTR作为基址寄存器时查表比较简单,查表的步骤分三步 基址(表格首地址)送DPTR数据指针; 所查表索引值(在表中的位置是第几项)送累加器A; 执行查表指令 MOVC A,ADPTR,进行读数,查表结果送回累加器A。 当使用PC作为基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,查表时其操作有所不同。查表的步骤也分三步: 使用传送指令把所查数据索引值送入累加器A。 使用 ADD A,#data 指令对累加器A进行修正。dat

    21、a值由下式确定。PC + data = 数据表首地址 其中,PC是 MOVC A,A+PC 下一条指令的地址。因此,data值实际等于查表指令和数据表格之间的字节数 。 执行查表指令 MOVC A,APC 完成查表。 注意:MOVC A, A+DPTR 指令可以实现64K地址范围内的数据查寻,而MOVC A,A+PC指令只能实现256字节范围内的数据查寻。,规则变量的查表程序设计,如果数据表格中值位单字节,且表格占有的单元数少于256,则查表方法比较简单。 例 设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。ORG 30H 3

    22、0H 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,38HDB 39H,41H,42H,43H,44H,45H,46H,子程序结构与设计,子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情况,如果重新书写这个程序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高

    23、编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间。 要给每个子程序赋一个名字,实际是一个入口地址代号。 要正确地传递函数,首先要有入口条件(入口参数),说明进入子程序时处理的数据如何得到(从累加器A 、寄存器R0-R7等处);还要有出口条件(出口参数),即处理的结果是如何存放的。注意保护现场和恢复现场。在执行子程序时,可能使用到累加器A或工作寄存器,所以在执行子程序前,应将这些内容保存起来,即保护现场。当子程序执行完,返回到主程序之前,在将这些内容取出送回到累加器A或原来的寄存器中,这一过程称为恢复现场。,子程序调用与返回,主程序调用子程序是通过子程序调用命令“LCALL ad

    24、d16”和”ACALL add11”来实现的。前者称为”长调用指令“,给出16位子程序首地址,后者称为”绝对调用指令“,给出的操作数是子程序低11位入口地址,和程序计数器PC高5位合在一起,构成16位转移地址。 子程序调用指令功能是将PC中的内容(下一条指令的地址,称为”断点“)压入堆栈(保护断点)。然后将调用地址送入PC,使程序转入子程序的入口地址。 子程序的返回是通过返回指令RET实现的。该指令的功能是将堆栈存放的返回地址(即断点)弹出堆栈,并送回到PC中,使程序继续从断点处执行。 在主程序中,不希望被子程序更改内容的寄存器在调用前,在主程序中安排压栈指令来保护现场;子程序返回后,再安排弹

    25、出指令恢复现场。 在需要保护现场的程序中,要正确地设置堆栈指针。,子程序设计,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位十进制数),计算某数的平方可采用查表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。设a, b分别存放于片内RAM的30H, 31H两个单元中,结果c存放于片内RAM的4

    28、0H单元。程序流程图如图所示。,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 $ ; 程序执行完,“原地踏步” 求平方子

    29、程序如下(采用查平方表的方法):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码转换成十六进制数,并把结果仍存于原单元中. 解:对于小于、等于 9的数,ASCII代码减去30H得一位十六进制数,对于大于9的ASCII代码减去37H,则恰好是“0AH0FH”的结果。 HE

    30、X: MOV A,R0 ;取操作数CLR CSUBB A,#30H ;09的转换MOV R0,A ;暂存结果SUBB A,#0AH ;结果是否大于9JC SB2 ;小于、等于9,则返回XCH A,R0SUBB A,#07H ;大于9,则再减07HMOV R0,A ;存结果 SB2: RET,综合程序举例(运算类程序类),例已知被减数在R2、R3中,减数在R6、R7中,且R2、R6为高字节。要把差放在片外存储器0300H、0301H中,且高位在前。 解:把双字节无符号数减法编变成子程序减法时先减低位。,BSUB: LCALL ASUBMOV A,R4MOV DPTR,#0300HMOVX DPT

    31、R,AMOV A,R5INC DPTRMOVX DPTR,A (入口R2、R3被减数R6、R7减数;出口R4高位R5低位) ASUB: MOV A,R3CLR CSUBB A,R7 ;低位字节相减MOV R5,A ;存低位字节差MOV A,R2SUBB A,R6 ;高位字节相减MOV R4,A ;存高位字节差RET,综合程序举例(常用I/O口程序),例 P1.0端口输出1kHZ和2kHZ的变频音调,每隔1S交替变换一次。 周期数 源程序 注释 1 DLV: MOV R2,08H ;1kHZ的持续时间 1 DLV1:MOV R3 ,0FAH ;(R3)=250 1 DLV2:CPL P1.0 ; 输出1kHZ方波(P1.0 取非) 2 LCALL D0.5ms ; 延时0.5ms,省略 2 DJNZ R3,DLV2 2 DJNZ R2,DLV1 ; 持续1s 1 MOV R2,#10H ;2kHZ的持续时间 1 DLV3: MOV R3,#0FAH ;(R3)=250 1 DLV4: CPL P1.0 ;输出2kHZ方波 2 LCALL D0.25ms ; 延时0.25ms,省略 2 DJNZ R3,DLV4 2 DJNZ R2,DLV3 ;持续1s 2 SJMP DLV ; 反复循环,END,END,

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《嵌入式系统概论-单片机基础》单片机之汇编语言1.ppt
    链接地址:https://www.docduoduo.com/p-3356995.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开