第4章汇编语言程序设计方法课件

上传人:ni****g 文档编号:567515369 上传时间:2024-07-21 格式:PPT 页数:36 大小:426KB
返回 下载 相关 举报
第4章汇编语言程序设计方法课件_第1页
第1页 / 共36页
第4章汇编语言程序设计方法课件_第2页
第2页 / 共36页
第4章汇编语言程序设计方法课件_第3页
第3页 / 共36页
第4章汇编语言程序设计方法课件_第4页
第4页 / 共36页
第4章汇编语言程序设计方法课件_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《第4章汇编语言程序设计方法课件》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计方法课件(36页珍藏版)》请在金锄头文库上搜索。

1、4.1汇编语言源程序的格式和伪指令汇编语言源程序的格式和伪指令4.2汇编语言源程序的汇编汇编语言源程序的汇编4.3程序设计方法程序设计方法计算机程序设计语言:计算机程序设计语言:机器语言,汇编语言,语言机器语言,汇编语言,语言机器语言:能被计算机直接识别和执行,但它不易为人机器语言:能被计算机直接识别和执行,但它不易为人们编写和阅读。们编写和阅读。高级语言:一种面向过程和问题并能独立于机器(编程高级语言:一种面向过程和问题并能独立于机器(编程者不必熟悉机器内部的硬件结构)的通用程序设计语言,者不必熟悉机器内部的硬件结构)的通用程序设计语言,是一种接近人们自然语言和常用数字表达式的计算机语是一种

2、接近人们自然语言和常用数字表达式的计算机语言。但是程序执行的速度慢,且占据的存储空间较大。言。但是程序执行的速度慢,且占据的存储空间较大。汇编语言:一种面向机器的语言,它的指令助记符和机汇编语言:一种面向机器的语言,它的指令助记符和机器语言间保持着一一对应的关系。编程者能把处理过程器语言间保持着一一对应的关系。编程者能把处理过程描述的非常具体,因此通过优化能编制出高效率的程序,描述的非常具体,因此通过优化能编制出高效率的程序,既可节省存储空间又可提高程序执行的速度。在实时控既可节省存储空间又可提高程序执行的速度。在实时控制的场合下,计算机的监控程序大多采用汇编语言编写。制的场合下,计算机的监控

3、程序大多采用汇编语言编写。单片机:汇编语言单片机:汇编语言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 汇编语言源程序的格式和伪指令汇编语言源程序的格式和伪指令一、汇编语言源程序的格式一、汇

4、编语言源程序的格式汇编语言程序由一条条的汇编语句(汇编指令)构成。汇编语言程序由一条条的汇编语句(汇编指令)构成。汇编语句必须严格按照规定的格式编写,否则汇编语句必须严格按照规定的格式编写,否则“语法语法”错误。错误。汇编语句汇编语句1、指令性语句、指令性语句标号标号: 操作码助记符操作码助记符 操作数操作数1,操作数操作数2 ;注释注释(1)标号标号 位于语句开头,实际是指明该指令操作码所在地址的位于语句开头,实际是指明该指令操作码所在地址的符号。符号。 标号由标号由1-8个字符(字母或数字)组成,但头一个字个字符(字母或数字)组成,但头一个字符必须是字母。不能用指令助记符、寄存器符号等作标

5、号。符必须是字母。不能用指令助记符、寄存器符号等作标号。(2)操作码操作码(3)操作数操作数 可以是一个、两个、三个,或者没有。操作码与操作数可以是一个、两个、三个,或者没有。操作码与操作数间要有一定的空格,操作数之间要以逗号隔开。间要有一定的空格,操作数之间要以逗号隔开。 当操作数是立即数时,数后面要有后缀以表明它的进制当操作数是立即数时,数后面要有后缀以表明它的进制形式;当为十六进制且以字母形式;当为十六进制且以字母AF开头时,前还需再加个开头时,前还需再加个“0”。如。如 MOV A,#0F4H汇编语言源程序的格式汇编语言源程序的格式 SJMP $ 当以$作为操作数时,表示转移到本语句开

6、头,反复执行本指令,令程序暂停于此。与 HERE: SJMP HERE 是等价的。汇编语言源程序的格式汇编语言源程序的格式2、指示性语句、指示性语句伪指令伪指令 又称为又称为“伪指令伪指令”,不是真正的指令,不产生相应的机,不是真正的指令,不产生相应的机器码,只是在计算机将汇编语言转换成机器码时所用到的器码,只是在计算机将汇编语言转换成机器码时所用到的一些说明。一些说明。(1) 定义起始地址伪指令定义起始地址伪指令ORG (Origin)格式:格式: 标号标号: ORG 地址地址 指出了后面第一条指令的机器码的存放地址。指出了后面第一条指令的机器码的存放地址。如:如: ORG 0000HLJM

7、P MAIN(2)结束伪指令结束伪指令END END要写在全部源程序的末尾,要写在全部源程序的末尾,END之后的任何语句汇编之后的任何语句汇编程序都不会处理。程序都不会处理。(3)赋值伪指令赋值伪指令EQU (Equate)格式:格式: 字符名称字符名称 EQU 赋值项赋值项 给字符名称赋予一个特定值(可以是给字符名称赋予一个特定值(可以是8位或位或16位二进制数)。字位二进制数)。字符名称必须先赋值后使用,所以一般放在源程序的开头,且一旦赋值符名称必须先赋值后使用,所以一般放在源程序的开头,且一旦赋值后,在整个程序中都有效。且在同一个源程序中,任何一个字符名称后,在整个程序中都有效。且在同一

8、个源程序中,任何一个字符名称只能赋值一次。只能赋值一次。如:如: 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

9、汇编语言源程序的格式汇编语言源程序的格式(5)定义字伪指令定义字伪指令DW (Define Word) 从指定的地址单元开始,在从指定的地址单元开始,在ROM中定义一个或多个数据字(一次存中定义一个或多个数据字(一次存入的字占两个单元,高入的字占两个单元,高8位在前,低位在前,低8位在后)。位在后)。格式:格式: 标号标号: DW 16位数据字或数据字表位数据字或数据字表如:如: ORG 1000H 1000H DW 0123H,29H,AB从程序存储器的从程序存储器的1000H单元开始,依次存入单元开始,依次存入01H,23H,00H,29H,41H,42H。汇编语言源程序的格式汇编语言源程

10、序的格式(6)定义预留空间伪指令定义预留空间伪指令DS (Define Storage)从指定地址开始,保留一定数目的存储单元作为备用空间,以供程序执从指定地址开始,保留一定数目的存储单元作为备用空间,以供程序执行过程中使用。行过程中使用。如:如: ORG 1200H RES: DS 10H DB A,B,C汇编语言源程序的格式汇编语言源程序的格式(7)定义位地址赋值伪指令BIT格式: 字符名称 BIT 位地址功能:把位地址赋予规定的字符名称。只能用于有位地址的位。如:X0BIT00HX1BIT01H汇编语言源程序的格式汇编语言源程序的格式4.3 汇编语言程序设计方法汇编语言程序设计方法汇编语

11、言程序设计通常的步骤是:1、建立数学模型2、确定算法,绘制程序流程图3、编写源程序4、汇编及调试程序。汇编语言程序设计方法 顺序程序,分支程序,循环程序,查表程序,子程序调用,延时程序一、顺序程序设计一、顺序程序设计例:试将例:试将30H单元的十六进制数转换成十进制数,并将百位、十位和个单元的十六进制数转换成十进制数,并将百位、十位和个位数分别存放在位数分别存放在31H、32H、33H单元中。单元中。MOVA,30HMOVB,#100DIVABMOV31H,AMOVA,#10XCHA,BDIVABMOV32H,AMOV33H,B分支程序主要是根据判断条件的成立与否来确定程序的走向,故需要使用控

12、制转移类指令。1、单分支选择结构 程序的判断仅有两个出口,二者选一,称为单分支结构。例4-3 设内部RAM 40H和41H单元存放2个8位无符号二进制数,试编程找出其中的大数存入30H单元。MOVA,40HCJNEA,41H,NEXTNEXT:JNCNEXT1MOV30H,41HSJMPEXITNEXT1:MOV30H,40HEXIT:SJMP$二、分支程序设计二、分支程序设计2、多分支选择结构当程序的判别部分有两个以上的出口流向时,称为多分支选择结构。例4-4 设内部RAM 50H和51H单元存放2个8位有符号二进制数,试编程找出其中的大数存入60H单元。MOVA,50HXRLA,51HJB

13、ACC.7,NEXT1;判断是否异号,若异号转移MOVA,50HCLRCSUBBA,51H;若同号直接比较大小关系JCNEXT2MOV60H,50HSJMPEXIT分支程序设计分支程序设计NEXT1:MOVA,50HJBACC.7,NEXT2MOV60H,50HSJMPEXITNEXT2:MOV60H,51HEXIT:SJMP$分支程序设计分支程序设计 循环结构由四部分组成:初始化部分、循环处理部分、循环控制部分、循环结束部分。 根据循环程序的结构不同也可分为单重循环和多重循环。对循环次数的控制有多种。循环次数已知的,可用循环次数计数器控制循环。对循环次数未知的,可以按条件控制循环。1、单重循

14、环 程序设计例4-6 设内部RAM存有一无符号数数据块,长度为128B,在以30H单元为首址的连续单元中。试编程找出其中最小的数,并放在20H单元。三、循环程序设计三、循环程序设计例例4-6 内部内部RAM存有一无符号数数据块,长度为存有一无符号数数据块,长度为128B,在以,在以30H单元单元为首址的连续单元中。试编程找出其中最小的数,并放在为首址的连续单元中。试编程找出其中最小的数,并放在20H单元。单元。MOVR7,#127MOVR0,#30HMOV20H,R0LOOP:INCR0MOVA,R0CJNEA,20H,NEXTNEXT:JNCLOP1MOV20H,ALOP1:DJNZR7,L

15、OOPSJMP$循环程序设计循环程序设计例例4-7 设设30H单元为首址的内部单元为首址的内部RAM中存有一个数表,长度为中存有一个数表,长度为50字节。字节。要求顺序检索出一个关键字要求顺序检索出一个关键字“$“(ASCII码为码为24H),若有则将特征值),若有则将特征值00H存入存入20H单元,若无则将特征值单元,若无则将特征值0FFH存入存入20H单元。单元。MOVR7,#50MOVR0,#30HLOOP:CJNER0,#24H,NEXTMOV20H,#00HSJMPEXITNEXT:INCR0DJNZR7,LOOPMOV20H,#0FFHEXIT:SJMP$循环程序设计循环程序设计2

16、、多重循环 程序设计多重循环:一个循环程序的循环体中还包含一个或多个循环的结构多重循环结构必须层次分明,循环时从外层向内层一层层进入,从内层向外层一层层退出,两循环之间不允许交叉。51单片机对循环嵌套重数没有限制。例4-9 用软件实现10ms的延时,设晶振频率是12MHz。START: MOVR6,#10LOOP1:MOVR7,#200LOOP: NOPNOPNOPDJNZR7,LOOPDJNZR6,LOOP1RET循环程序设计循环程序设计四、子程序设计四、子程序设计 在程序设计中会遇到多次使用同一个程序段的情况,如软件延时、代码转换、数制转换、检索与排序、函数运算等。为了简化程序设计,可以将

17、这些相对独立的多次使用的程序段作为子程序。 51单片机:子程序调用和子程序返回指令。没有规定子程序嵌套的重数,它只受堆栈空间的限制。 一般在调用子程序前需要设置子程序的入口参数和出口参数。其参数传递方法有三种:利用寄存器传递参数;利用寄存器间接寻址传递参数;利用堆栈传递参数。1、利用寄存器传递参数 将要传递的参数存放在工作寄存器或累加器A中以便传递给子程序或主程序。缺点是传递参数少。例4-11 内部RAM存有128B的ASCII码字符串,首址为30H。要求将该字符串中的每个字符按偶校验在最高位加偶校验位。试以调用程序的方法来实现。例4-11MOVR0,#30HMOVR7,#128LOOP:MO

18、VA,R0LCALL SUB1MOVR0,AINCR0DJNZR7,LOOPSJMP$SUB1:ADDA,#0;利用累加器A传递参数。在A的最高位加奇;偶校验位JNBP,EXITORLA,#80HEXIT:RET子程序设计子程序设计2、用寄存器间接寻址方法传递参数 用数据地址指针来指出数据的位置。如果参数在内部RAM中,可用R0、R1作指针;若存放在外部RAM中,可用R0、R1或DPTR作指针。这种方法可实现数据长度可变的运算,并大大节省了参数传递中的工作量。子程序设计子程序设计例例4-13 设内部设内部RAM中存有一中存有一ASCII字符串,长度不超过字符串,长度不超过127B,起始地,起始

19、地址放在调用程序的址放在调用程序的R0中,字符串结束标志为中,字符串结束标志为“#”(ASCII码值为码值为23H),试设计一个确定),试设计一个确定ASCII码字符串长度的子程序。要求将得到码字符串长度的子程序。要求将得到的长度值放入的长度值放入R1为地址指针的内部为地址指针的内部RAM单元中,作为出口参数。单元中,作为出口参数。子程序:子程序:SUB: MOVR7,#00HLOOP: MOVA,#23HCLRCSUBB A,R0JZLOP1INCR0INCR7SJMPLOOPLOP1: MOVA,R7MOVR1,ARET子程序设计子程序设计3、利用堆栈传递参数 调用前可把子程序的入口参数压

20、入堆栈。被调用的子程序在执行中需要间接访问堆栈获取其入口参数,并把运算结果的出口参数送回堆栈。调用程序再通过出栈操作获取子程序的出口参数。 这种方法传递参数量大,且不必为传递这些参数分配存储单元。例4-15 有10个字节的无符号数自栈顶起依次存放在堆栈中。请编写一求出它们和的子程序,并存入栈顶的相邻两个单元中,先放低字节数,再放高字节数。子程序:SUB:SETBRS1;设置当前工作寄存器组为第3组SETBRS0;目的是保护调用程序中的R0R7的内容不变MOVR7,#10;设置字节长度MOVR2,#0;存放和的低8位MOVR3,#0;存放和的高8位CLRC子程序设计子程序设计POP30H;先弹出

21、断点地址POP31H;将断点地址暂存于30H、31H单元LOOP: POPACC;取数ADDA,R2MOVR2,ACLRAADDC A,R3MOVR3,ADJNZR7,LOOPPUSH1AH;存和的低8位(R2的内容入栈)PUSH1BH ;存和的高8位(R3的内容入栈)PUSH31H;压入断点地址PUSH30HRET子程序设计子程序设计附:有附:有10个无符号数存于个无符号数存于50H起的起的10个单元内,求它们的和并存于个单元内,求它们的和并存于60H(低(低8位)和位)和61H(高(高8位)单元中。直接编程实现。位)单元中。直接编程实现。程序:程序:MOVR0,#50HMOVR7,#10M

22、OV60H,#0MOV61H,#0LOOP: MOVA,R0ADDA,60HMOV60H,ACLRAADDC A,61HMOV61H,AINCR0DJNZR7,LOOPSJMP$子程序设计子程序设计五、查表程序设计五、查表程序设计 查表程序广泛应用于LED显示控制中查字段码表、键盘扫描控制中查键值表、代码转换中查ASCII码表等程序中。 所谓查表,就把事先设计的数据按一定顺序编制成表格,存放在程序存储器中,由查表程序查出所需要的表格中的数据。例4-16 设在内部RAM 30H单元中存有一位十六进制数,试通过查表的方法把它转换为ASCII码,并存入40H单元中。解析:09对应的ASCII码是30

23、H39H,AF对应的ASCII码是41H46H。TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB 41H,42H,43H,44H,45H,46HTRANS:MOVA,30HMOVDPTR,#TABMOVC A,A+DPTRMOV40H,A六、散转程序设计六、散转程序设计课后习题课后习题习题习题4-5 从内部从内部RAM的的20H单元开始,有单元开始,有15个数据。试编写一段程序,个数据。试编写一段程序,把其中的正数、负数分别送到把其中的正数、负数分别送到41H和和61H开始的存储单元,并分别将开始的存储单元,并分别将正数、负数的个数送正数、负数的

24、个数送40H和和60H单元。单元。解:解:MOV40H,#0MOV60H,#0CLRRS0CLRRS1;设置当前工作寄存器区为第设置当前工作寄存器区为第0区区MOVSP,#70HMOVR7,#15;设置数据长度设置数据长度MOVR0,#20H;设置数据区地址设置数据区地址MOVR1,#41HMOVDPTR,#0061HLOOP:MOVA,R0JNBACC.7,NEXTPUSH01H;若为负数先把R1内容入栈保护MOVR1,DPL;把负数的存储地址给R1MOVR1,APOP01H;把正数的存储地址弹出给R1INCR0INCDPTRINC60H;负数个数DJNZR7,LOOPSJMPEXITNEX

25、T:MOVR1,AINCR0INCR1INC40H;正数个数DJNZR7,LOOPEXIT:SJMP$习题习题4-8 试编程将存放在试编程将存放在8032单片机内部单片机内部RAM中首址为中首址为20H、长度为、长度为50H的数据块,送到片外的数据块,送到片外RAM以以20H为首地址的连续单元中。为首地址的连续单元中。解:解:MOVR0,#20HMOVDPTR,#20HMOVR7,#50HLOOP:MOVA,R0MOVX DPTR,AINCR0INCDPTRDJNZR7,LOOPSJMP$习题习题4-9 设一字符串存放在设一字符串存放在8032单片机内部单片机内部RAM以以20H为首址的连续单

26、元中,为首址的连续单元中,字符串以回车(回车符的字符串以回车(回车符的ASCII码是码是0DH)结束。要求统计该字符串中字符)结束。要求统计该字符串中字符C(C=43H)的个数,并将其存入外部)的个数,并将其存入外部RAM的的40H单元中。试编写实现上述单元中。试编写实现上述要求的程序。要求的程序。解:解:MOVDPTR,#40HMOVR0,#20HMOVR7,#0;存放字符存放字符C的个数的个数LOOP:MOVA,R0XORA,#0DHJZLASTMOVA,R0INCR0;指向字符串中的下一个字符指向字符串中的下一个字符CJNEA,#43H,LOOPINCR7SJMPLOOPLAST:MOV

27、A,R7MOVXDPTR,ASJMP$习题习题4-10 设有一长度为设有一长度为20H的字符串,存放在片外的字符串,存放在片外RAM 1000H为首地为首地址的连续单元中,试编程实现将其中数字和字母分开并将它们分别送址的连续单元中,试编程实现将其中数字和字母分开并将它们分别送到片内到片内RAM以以30H和和50H为首地址的连续单元中。为首地址的连续单元中。解析:数字解析:数字0-9的的ASCII码为码为30H39H,而字母的,而字母的ASCII码在码在41H7AH之间,可以通过它们和之间,可以通过它们和40H相与判断是数字还是字母,如果相与的结相与判断是数字还是字母,如果相与的结果为果为0,则为数字,否则为字母。,则为数字,否则为字母。MOVR7,#20H;置串长度置串长度MOVDPTR,#1000HMOVR0,#30H;数字存放区首址数字存放区首址MOVR1,#50H;字母存放区首址字母存放区首址LOOP: MOVX A,DPTRANDA,#40HJZNEXT;若为数字则转移若为数字则转移MOVX A,DPTRMOVR1,AINCR1SJMPLASTNEXT: MOVX A,DPTRMOVR0,AINCR0LAST:INCDPTRDJNZR7,LOOPSJMP$

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号