单片机汇编语言程序设计知识PPT.ppt
第4章汇编语言程序设计知识,4.1汇编语言程序的汇编,1.机器语言 11100101 00110000 00100101 01000000 11110101 01010000 2.汇编语言 MOV A,30H ADD A,40H MOV 50H,A3.高级语言高级语言是一种面向算法和过程的语言。如:FORTAN、BASIC、C语言,4.2汇编语言程序设计概述,汇编语言语句格式标号:操作数;注释 1.标号标号是语句地址的标志符号、代表该语句指令代码第一个字节的地址。2.操作码助记符 此为语句中唯一不可缸少的部分,也是语句的核心,表示该语句进行何种操作。3.操作数 操作数是指令的操作对象。4.注释注释是为方便程序的编写、理解、交流而书写的说明解释性文字、符号。,伪指令,1.汇编起始地址伪指令ORG(Origin)格式:标号:ORG 功能:规定目标程序段式数据块的起始地址。说明:总放在源程序段的开头和数据块的开头 2.汇编结束指令END格式:标号:END 功能:告诉汇编程序,源程序到此结果,汇编到此截止。说明:一个程序只能有一条END命令,且位于程序的最后。汇编程序对END语句以后的语句不进行汇编。例如:ORG 2000H START:MOV A,B JNB ACC.7,DONE CPL A DONE:MOV B,A END,格式:标号:DB 功能:从指定的地址单元开始,存入规定好的8位数(字节数据)说明:1)存贮地址单元可由前一条指令确定或由ORG命令指定;2)当存贮多个数时,中间用“,”隔开。例如:ORG 8000H MOV A,40H TAB:DB 40H,1101B,96表示从8002H单元开始分别存放40H,0DH,43H例:ORG 1000H DB“How are you”则把字符串中的字符按ASCII码连续存放在1000H100AH 11个单元中(包括两个空格)。注意:DB 0FA2H 是非法的,因0FA2H不是字节数。,3.字节定义伪指令DB(Define Byte),格式:标号:DW 功能:从指定的地址开始,存入字十六位数据(字数据)。说明:存入数据时高位在前,低位在后,即高8位存入低地址单 元,低8位存入高地址单元。例:ORG 1000H DW 765AH,40H,“AB”则1000H1005H单元依次存放着:76H,5AH,00H,40H,41H,42H。注意:1)DW语句中,40H是8位数,按16位数0040H存放.2)DW“ABC”及DW“How are you”是非法的,而 DB“ABC”“How are you”则是合法的。,4.字定义伪指令DW(Define Word),格式:标号:DS 功能:从指令的地址单元开始,保留指定数目的字节单元作为备用空间。例:ORG 1000H DS 20 START:MOV A,#00H则汇编后,从1000H开始,保留20个单元作它用,第三条指令的标号START的地址应为1014H。注意:MCS-51系列单片机,DB、DW、DS伪指令只能用于程序存贮器,不能对数据存贮器使用。,5.空间定义伪指令DS(Define Storage),格式:EQU 功能:将右边的值赋给左边用户定义的字符。说明:1)赋值后的字符即可做为地址使用,也可以做为立即数 使用;2)一经使用EQU赋值,整个程序有效;3)所赋值可是8位(字节)或16位(字);4)该伪指令一般放在程序的开始段;5)指令字符名称构成的规定和地址标号一样,但不是标号,使用时后无“:”。例如程序段:ORG 8000HAA EQU 10H;AA=10H ABC EQU AA+10H;ABC=20H MOV A,ABC;A 20H BS:ADD A,#AA;A(A)+10H 说明:程序中,AA、ABC是字符名称,BS是标号。,6.赋值伪指令EQU(Equate),格式:BIT 功能:把位地址赋给指定的字符名称。例:A1 BIT P1.0 A2 BIT 20H 说明:赋值命令和位定义命令仅为方便编程和阅读理解程序使用,使用时,字符名称或位名称一般取有意义且便于记忆的字母数字。,7.位定义伪指令BIT,汇编语言程序设计一般步骤,(1)分析问题,明确任务(2)建立数学模型,确定算法(3)绘制程序流程图(4)编写源程序(5)汇编、调试,循环结构程序设计,典型循环结构包括四部分:初始化部分循环处理部分循环控制部分循环结束部分,1.设置循环计数器实现已知循环次数的循环控制,程序如下:MOV R0,#64H;设置循环计数器 MOV DPTR,#DATA;设置地址指针 CLR ALOOP:MOVX DPTR,A;清0 INC DPTR DJNZ R0,LOOP;判0结束循环,例4-7 将首址为DATA的100个外部RAM单元清零。解该例为已知循环次数的循环程序将循环次数数存放在R0中。椐图如4-7所示。,2.使用测试条件转移指令控制未知次数的循环,例4-8 设某以“$”为结束标志的字符中共不超过256个,存放在内部RAM以STA为首址的连续单元里,设统计此字符中长度并存放到内部RAM的LEN单元中。解法一框图如图4-8所示:程序如下:ORG 1000H MOV R2,#STA;设地址指针 MOV B,#00H;设计数器LOOP:MOV A,R2 CJNE A,“$”,NEXT;判断是否结束 MOV LEN,B;存数据结果 SJMP DONE NEXT:INC B;修改计数器 INC R2;修改地址指针,准备下一次循环 SJMP LOOP DONE:END,程序如下:ORG 1000H MOV R2,#STA-1;设地址指针 MOV B,#0FFH;设计数器LOOP:INC R2;修改地址指针,准 备下一次循环 INC B;修改计数器 MOV A,R2;取数 CJNE A,“$”,LOOP;判断循环是否结束 MOV LEN,B;存数据 END说明:1)解法一为先判断后处理形式,更符合人们的习惯思维,但使用了无条件转移指令,程序结构不清晰,质量不高。2)解法二为先处理后判断形式,我们要熟悉并掌握这种方法,同时注意解法二中对地址指针R2和计数器B的初值设置。,解法二框图如图4-9所示。,4.2.4 子程序设计,1.子程序的概念2.子程序调用 主程序调用子程序指令:LCALL、ACALL子程序执行结束返回指令:RET,3.现场保护 子程序执行时首先必须将两段程序都用到的寄存器或存贮单元保存起来,称现场保护。在子程序返回前,再将保存起来的内容恢复到原处,返回后继续执行程序,这个过程称恢复现场。对于PC值的现场保护和恢复是由计算机在执行LCALL,ACALL和RET时自动完成的。对于其它需要保护的存贮单元,由程序员在子程序的开头和结尾编程实现,一般也是用栈操作指令完成的。4.主程序与子程序的参数传递 主程序在调用子程序时必须将具体的数据传递给子程序中相应的变量(寄存器等),这些数据称入口参数。子程序执行结束后也必须将运行结果传递给主程序供主程序使用,这些结果数据称出口参数。,例4-12设内部存放长度为40H的ASCII字符串,首址为40H。试将该字符中每一个字符中加偶校验位。要求先编写ASCII字符的偶校验子程序,通过子程序调用完成所给任务。解该例中,入口参数仅有一个ASCII数,出口数据也只有一个加校验位的ASCII字符,可只用累加器A传送。子程序编写如下:ORG 0120H SUB:ADD A,#00H;根据A中字符的1的个数;产生PSW的奇偶标志位P JNB P,DONE;判A中1个数是否为偶数 ORL A,#80H;为奇,置标志位1DONE:RET,主程序如下:ORG 0100H MAIN:MOV R0,#40H MOV R7,#40H;置循环计数器NEXT:MOV A,R0;取数 ACALL SUB;调用子程序置校验位 MOV R0,A;存已加校验位的ASCII字符 INC R0;修改指针,指向下一单元 DJNZ R7,NEXT;计数器减1判0 END说明:1)完成后的程序清单一般按地址顺序列出。2)每段程序前以ORG伪指令确定该程序段位置。3)每个子程序的首址必须有标号作为主程序调用的入口地址。4)每个子程序的结束必须有RET以指令返回主程序。5)END伪指令在全部程序之后,而不是主程序之后。6)地址标号,变量等尽量取有意义的合法字符,以便阅读。,