《第4章汇编语言程序设计方法课件.ppt》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计方法课件.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4.1汇编语言源程序的格式和伪指令4.2汇编语言源程序的汇编4.3程序设计方法计算机程序设计语言:机器语言,汇编语言,语言机器语言:能被计算机直接识别和执行,但它不易为人们编写和阅读。高级语言:一种面向过程和问题并能独立于机器(编程者不必熟悉机器内部的硬件结构)的通用程序设计语言,是一种接近人们自然语言和常用数字表达式的计算机语言。但是程序执行的速度慢,且占据的存储空间较大。汇编语言:一种面向机器的语言,它的指令助记符和机器语言间保持着一一对应的关系。编程者能把处理过程描述的非常具体,因此通过优化能编制出高效率的程序,既可节省存储空间又可提高程序执行的速度。在实时控制的场合下,计算机的监控程序
2、大多采用汇编语言编写。单片机:汇编语言4.2 汇编语言源程序的汇编单片机:汇编语言(汇编语言)源程序 目标程序(机器语言)助记符 机器码汇编软件汇编过程汇编语言源程序 机器码 ORG 1000HSTART:MOV R7,#200DLY1:NOP NOP NOP DJNZ R7,DLY1 RET 地址 指令码1000H 7F C81002H 001003H 001004H 001005H DF rel1007H 22汇编4.1 汇编语言源程序的格式和伪指令一、汇编语言源程序的格式汇编语言程序由一条条的汇编语句(汇编指令)构成。汇编语句必须严格按照规定的格式编写,否则“语法”错误。汇编语句1、指令
3、性语句 标号:操作码助记符 操作数1,操作数2;注释(1)标号 位于语句开头,实际是指明该指令操作码所在地址的符号。标号由1-8 个字符(字母或数字)组成,但头一个字符必须是字母。不能用指令助记符、寄存器符号等作标号。(2)操作码(3)操作数 可以是一个、两个、三个,或者没有。操作码与操作数间要有一定的空格,操作数之间要以逗号隔开。当操作数是立即数时,数后面要有后缀以表明它的进制形式;当为十六进制且以字母AF 开头时,前还需再加个“0”。如 MOV A,#0F4H汇编语言源程序的格式 SJMP$当以$作为操作数时,表示转移到本语句开头,反复执行本指令,令程序暂停于此。与 HERE:SJMP H
4、ERE 是等价的。汇编语言源程序的格式2、指示性语句伪指令 又称为“伪指令”,不是真正的指令,不产生相应的机器码,只是在计算机将汇编语言转换成机器码时所用到的一些说明。(1)定义起始地址伪指令ORG(Origin)格式:标号:ORG 地址 指出了后面第一条指令的机器码的存放地址。如:ORG 0000HLJMP MAIN(2)结束伪指令END END 要写在全部源程序的末尾,END 之后的任何语句汇编程序都不会处理。(3)赋值伪指令EQU(Equate)格式:字符名称 EQU 赋值项 给字符名称赋予一个特定值(可以是8 位或16 位二进制数)。字符名称必须先赋值后使用,所以一般放在源程序的开头,
5、且一旦赋值后,在整个程序中都有效。且在同一个源程序中,任何一个字符名称只能赋值一次。如:C1 EQU 60H DEL EQU 2100H MOV A,C1;LCALL DEL;调用2100H 处的子程序汇编语言源程序的格式(4)定义字节伪指令DB(Define Byte)从指定的地址单元开始,在ROM 中定义一个或一串字节数据。格式:标号:DB 数据或数据表如:ORG 0100H TAB:DB 0,1,4,9,16,25,36,49,64,81 DB A,B,C DB Hello汇编语言源程序的格式(5)定义字伪指令DW(Define Word)从指定的地址单元开始,在ROM 中定义一个或多个
6、数据字(一次存入的字占两个单元,高8 位在前,低8 位在后)。格式:标号:DW 16 位数据字或数据字表如:ORG 1000H 1000H DW 0123H,29H,AB从程序存储器的1000H 单元开始,依次存入01H,23H,00H,29H,41H,42H。汇编语言源程序的格式(6)定义预留空间伪指令DS(Define Storage)从指定地址开始,保留一定数目的存储单元作为备用空间,以供程序执行过程中使用。如:ORG 1200H RES:DS 10H DB A,B,C汇编语言源程序的格式(7)定义位地址赋值伪指令BIT格式:字符名称 BIT 位地址功能:把位地址赋予规定的字符名称。只能
7、用于有位地址的位。如:X0 BIT 00HX1 BIT 01H汇编语言源程序的格式4.3 汇编语言程序设计方法汇编语言程序设计通常的步骤是:1、建立数学模型2、确定算法,绘制程序流程图3、编写源程序4、汇编及调试程序。汇编语言程序设计方法 顺序程序,分支程序,循环程序,查表程序,子程序调用,延时程序一、顺序程序设计例:试将30H 单元的十六进制数转换成十进制数,并将百位、十位和个位数分别存放在31H、32H、33H 单元中。MOV A,30HMOV B,#100DIV ABMOV 31H,AMOV A,#10XCH A,BDIV ABMOV 32H,AMOV 33H,B分支程序主要是根据判断条
8、件的成立与否来确定程序的走向,故需要使用控制转移类指令。1、单分支选择结构 程序的判断仅有两个出口,二者选一,称为单分支结构。例4-3 设内部RAM 40H 和41H 单元存放2 个8 位无符号二进制数,试编程找出其中的大数存入30H 单元。MOV A,40HCJNE A,41H,NEXTNEXT:JNC NEXT1MOV 30H,41HSJMP EXITNEXT1:MOV 30H,40HEXIT:SJMP$二、分支程序设计2、多分支选择结构当程序的判别部分有两个以上的出口流向时,称为多分支选择结构。例4-4 设内部RAM 50H 和51H 单元存放2 个8 位有符号二进制数,试编程找出其中的
9、大数存入60H 单元。MOV A,50HXRL A,51HJB ACC.7,NEXT1;判断是否异号,若异号转移MOV A,50HCLR CSUBB A,51H;若同号直接比较大小关系JC NEXT2MOV 60H,50HSJMP EXIT分支程序设计NEXT1:MOV A,50HJB ACC.7,NEXT2MOV 60H,50HSJMP EXITNEXT2:MOV 60H,51HEXIT:SJMP$分支程序设计 循环结构由四部分组成:初始化部分、循环处理部分、循环控制部分、循环结束部分。根据循环程序的结构不同也可分为单重循环和多重循环。对循环次数的控制有多种。循环次数已知的,可用循环次数计数
10、器控制循环。对循环次数未知的,可以按条件控制循环。1、单重循环 程序设计例4-6 设内部RAM 存有一无符号数数据块,长度为128B,在以30H 单元为首址的连续单元中。试编程找出其中最小的数,并放在20H 单元。三、循环程序设计例4-6 内部RAM 存有一无符号数数据块,长度为128B,在以30H 单元为首址的连续单元中。试编程找出其中最小的数,并放在20H 单元。MOV R7,#127MOV R0,#30HMOV 20H,R0LOOP:INC R0MOV A,R0CJNE A,20H,NEXTNEXT:JNC LOP1MOV 20H,ALOP1:DJNZ R7,LOOPSJMP$循环程序设
11、计例4-7 设30H 单元为首址的内部RAM 中存有一个数表,长度为50 字节。要求顺序检索出一个关键字“$“(ASCII 码为24H),若有则将特征值00H 存入20H 单元,若无则将特征值0FFH 存入20H 单元。MOV R7,#50MOV R0,#30HLOOP:CJNE R0,#24H,NEXTMOV 20H,#00HSJMP EXITNEXT:INC R0DJNZ R7,LOOPMOV 20H,#0FFHEXIT:SJMP$循环程序设计2、多重循环 程序设计多重循环:一个循环程序的循环体中还包含一个或多个循环的结构多重循环结构必须层次分明,循环时从外层向内层一层层进入,从内层向外层
12、一层层退出,两循环之间不允许交叉。51 单片机对循环嵌套重数没有限制。例4-9 用软件实现10ms 的延时,设晶振频率是12MHz。START:MOV R6,#10LOOP1:MOV R7,#200LOOP:NOPNOPNOPDJNZ R7,LOOPDJNZ R6,LOOP1RET循环程序设计四、子程序设计 在程序设计中会遇到多次使用同一个程序段的情况,如软件延时、代码转换、数制转换、检索与排序、函数运算等。为了简化程序设计,可以将这些相对独立的多次使用的程序段作为子程序。51 单片机:子程序调用和子程序返回指令。没有规定子程序嵌套的重数,它只受堆栈空间的限制。一般在调用子程序前需要设置子程序
13、的入口参数和出口参数。其参数传递方法有三种:利用寄存器传递参数;利用寄存器间接寻址传递参数;利用堆栈传递参数。1、利用寄存器传递参数 将要传递的参数存放在工作寄存器或累加器A 中以便传递给子程序或主程序。缺点是传递参数少。例4-11 内部RAM 存有128B 的ASCII 码字符串,首址为30H。要求将该字符串中的每个字符按偶校验在最高位加偶校验位。试以调用程序的方法来实现。例4-11MOV R0,#30HMOV R7,#128LOOP:MOV A,R0LCALL SUB1MOV R0,AINC R0DJNZ R7,LOOPSJMP$SUB1:ADD A,#0;利用累加器A 传递参数。在A 的
14、最高位加奇;偶校验位JNB P,EXITORL A,#80HEXIT:RET子程序设计2、用寄存器间接寻址方法传递参数 用数据地址指针来指出数据的位置。如果参数在内部RAM 中,可用R0、R1 作指针;若存放在外部RAM 中,可用R0、R1 或DPTR 作指针。这种方法可实现数据长度可变的运算,并大大节省了参数传递中的工作量。子程序设计例4-13 设内部RAM 中存有一ASCII 字符串,长度不超过127B,起始地址放在调用程序的R0 中,字符串结束标志为“#”(ASCII 码值为23H),试设计一个确定ASCII 码字符串长度的子程序。要求将得到的长度值放入R1 为地址指针的内部RAM 单元
15、中,作为出口参数。子程序:SUB:MOV R7,#00HLOOP:MOV A,#23HCLR CSUBB A,R0JZ LOP1INC R0INC R7SJMP LOOPLOP1:MOV A,R7MOV R1,ARET子程序设计3、利用堆栈传递参数 调用前可把子程序的入口参数压入堆栈。被调用的子程序在执行中需要间接访问堆栈获取其入口参数,并把运算结果的出口参数送回堆栈。调用程序再通过出栈操作获取子程序的出口参数。这种方法传递参数量大,且不必为传递这些参数分配存储单元。例4-15 有10 个字节的无符号数自栈顶起依次存放在堆栈中。请编写一求出它们和的子程序,并存入栈顶的相邻两个单元中,先放低字节数,再放高字节数。子程序:SUB:SETB RS1;设置当前工作寄存器组为第3 组SETB RS0;目的是保护调用程序中的R0R7 的内容不变MOV R7,#10;设置字节长度MOV R2,#0;存放和的低8 位MOV R3,#0;存放和的高8 位CLR C子程序设计