第4章汇编语言程序设计方法.ppt
- 文档编号:2121843
- 上传时间:2022-10-27
- 格式:PPT
- 页数:36
- 大小:523.50KB
第4章汇编语言程序设计方法.ppt
《第4章汇编语言程序设计方法.ppt》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计方法.ppt(36页珍藏版)》请在冰豆网上搜索。
4.1汇汇编语言源程序的编语言源程序的格式格式和和伪指令伪指令4.2汇汇编语言源程序的编语言源程序的汇编汇编4.3程序设计程序设计方法方法计算机程序设计语言:
计算机程序设计语言:
机器语言,汇编语言,高级语言机器语言,汇编语言,高级语言机器语言机器语言:
能被计算机直接识别和执行,但它不易为人们编写和阅读。
高级语言高级语言:
一种面向过程和问题并能独立于机器(编程者不必熟悉机器内部的硬件结构)的通用程序设计语言,是一种接近人们自然语言和常用数字表达式的计算机语言。
但是程序执行的速度慢,且占据的存储空间较大。
汇编语言汇编语言:
一种面向机器的语言,它的指令助记符和机器语言间保持着一一对应的关系。
编程者能把处理过程描述的非常具体,因此通过优化能编制出高效率的程序,既可节省存储空间又可提高程序执行的速度。
在实时控制的场合下,计算机的监控程序大多采用汇编语言编写。
单片机:
汇编语言单片机:
汇编语言4.2汇编语言源程序的汇编汇编语言源程序的汇编单片机:
汇编语言单片机:
汇编语言(汇编语言)源程序目标程序(机器语言)助记符机器码汇编软件汇编过程汇编语言源程序汇编语言源程序机器码机器码ORG1000HSTART:
MOVR7,#200DLY1:
NOPNOPNOPDJNZR7,DLY1RET地址指令码1000H7FC81002H001003H001004H001005HDFrel1007H22汇编汇编4.1汇编语言源程序的格式和伪指令汇编语言源程序的格式和伪指令一、汇编语言源程序的格式一、汇编语言源程序的格式汇编语言程序由一条条的汇编语句(汇编指令)构成。
汇编语句必须严格按照规定的格式编写,否则“语法”错误。
汇编语句1、指令指令性语句性语句标号标号:
操作码助记符操作码助记符操作数操作数1,操作数操作数2;注释注释
(1)标号位于语句开头,实际是指明该指令操作码所在地址的符号。
标号由1-8个字符(字母或数字)组成,但头一个字符必须是字母。
不能用指令助记符、寄存器符号等作标号。
(2)操作码(3)操作数可以是一个、两个、三个,或者没有。
操作码与操作数间要有一定的空格,操作数之间要以逗号隔开。
当操作数是立即数时,数后面要有后缀以表明它的进制形式;当为十六进制且以字母AF开头时,前还需再加个“0”。
如MOVA,#0F4H汇编语言源程序的格式汇编语言源程序的格式SJMP$当以$作为操作数时,表示转移到本语句开头,反复执行本指令,令程序暂停于此。
与HERE:
SJMPHERE是等价的。
汇编语言源程序的格式汇编语言源程序的格式2、指示性语句、指示性语句伪指令伪指令又称为“伪指令”,不是真正的指令,不产生相应的机器码,只是在计算机将汇编语言转换成机器码时所用到的一些说明。
(1)定义起始地址伪指令定义起始地址伪指令ORG(Origin)格式:
标号标号:
ORG地址地址指出了后面第一条指令的机器码的存放地址。
如:
ORG0000HLJMPMAIN
(2)结束伪指令结束伪指令ENDEND要写在全部源程序的末尾,END之后的任何语句汇编程序都不会处理。
(3)赋值伪指令赋值伪指令EQU(Equate)格式:
字符名称字符名称EQU赋值项赋值项给字符名称赋予一个特定值(可以是8位或16位二进制数)。
字符名称必须先赋值后使用,所以一般放在源程序的开头,且一旦赋值后,在整个程序中都有效。
且在同一个源程序中,任何一个字符名称只能赋值一次。
如:
C1EQU60HDELEQU2100HMOVA,C1;LCALLDEL;调用2100H处的子程序汇编语言源程序的格式汇编语言源程序的格式(4)定义字节伪指令定义字节伪指令DB(DefineByte)从指定的地址单元开始,在ROM中定义一个或一串字节数据。
格式:
标号标号:
DB数据或数据表数据或数据表如:
ORG0100HTAB:
DB0,1,4,9,16,25,36,49,64,81DBA,B,CDBHello汇编语言源程序的格式汇编语言源程序的格式(5)定义字伪指令定义字伪指令DW(DefineWord)从指定的地址单元开始,在ROM中定义一个或多个数据字(一次存入的字占两个单元,高高8位在前,低位在前,低8位在后位在后)。
格式:
标号标号:
DW16位数据字或数据字表位数据字或数据字表如:
ORG1000H1000HDW0123H,29H,AB从程序存储器的1000H单元开始,依次存入01H,23H,00H,29H,41H,42H。
汇编语言源程序的格式汇编语言源程序的格式(6)定义预留空间伪指令定义预留空间伪指令DS(DefineStorage)从指定地址开始,保留一定数目的存储单元作为备用空间,以供程序执行过程中使用。
如:
ORG1200HRES:
DS10HDBA,B,C汇编语言源程序的格式汇编语言源程序的格式(7)定义位地址赋值伪指令定义位地址赋值伪指令BIT格式:
字符名称字符名称BIT位地址位地址功能:
把位地址赋予规定的字符名称。
只能用于有位地址的位。
如:
X0BIT00HX1BIT01H汇编语言源程序的格式汇编语言源程序的格式4.3汇编语言程序设计方法汇编语言程序设计方法汇编语言程序设计通常的步骤是:
1、建立数学模型2、确定算法,绘制程序流程图3、编写源程序4、汇编及调试程序。
汇编语言程序设计方法汇编语言程序设计方法顺序程序,分支程序,循环程序,查表程序,子程序调用,延时程序一、顺序程序设计一、顺序程序设计例例:
试将30H单元的十六进制数转换成十进制数,并将百位、十位和个位数分别存放在31H、32H、33H单元中。
MOVA,30HMOVB,#100DIVABMOV31H,AMOVA,#10XCHA,BDIVABMOV32H,AMOV33H,B分支程序主要是根据判断条件的成立与否来确定程序的走向,故需要使用控制转移类指令。
1、单分支选择结构程序的判断仅有两个出口,二者选一,称为单分支结构。
例例4-3设内部RAM40H和41H单元存放2个8位无符号二进制数,试编程找出其中的大数存入30H单元。
MOVA,40HCJNEA,41H,NEXTNEXT:
JNCNEXT1MOV30H,41HSJMPEXITNEXT1:
MOV30H,40HEXIT:
SJMP$二、分支程序设计二、分支程序设计2、多分支选择结构当程序的判别部分有两个以上的出口流向时,称为多分支选择结构。
例例4-4设内部RAM50H和51H单元存放2个8位有符号有符号二进制数,试编程找出其中的大数存入60H单元。
MOVA,50HXRLA,51HJBACC.7,NEXT1;判断是否异号,若异号转移MOVA,50HCLRCSUBBA,51H;若同号直接比较大小关系JCNEXT2MOV60H,50HSJMPEXIT分支程序设计分支程序设计NEXT1:
MOVA,50HJBACC.7,NEXT2MOV60H,50HSJMPEXITNEXT2:
MOV60H,51HEXIT:
SJMP$分支程序设计分支程序设计循环结构由四部分组成:
初始化部分、循环处理部分、循环控制部分、循环结束部分。
根据循环程序的结构不同也可分为单重循环和多重循环。
对循环次数的控制有多种。
循环次数已知的,可用循环次数计数器控制循环。
对循环次数未知的,可以按条件控制循环。
1、单重循环程序设计例例4-6设内部RAM存有一无符号无符号数数据块,长度为128B,在以30H单元为首址的连续单元中。
试编程找出其中最小的数,并放在20H单元。
三、循环程序设计三、循环程序设计例例4-6内部RAM存有一无符号数数据块,长度为128B,在以30H单元为首址的连续单元中。
试编程找出其中最小的数,并放在20H单元。
MOVR7,#127MOVR0,#30HMOV20H,R0LOOP:
INCR0MOVA,R0CJNEA,20H,NEXTNEXT:
JNCLOP1MOV20H,ALOP1:
DJNZR7,LOOPSJMP$循环程序设计循环程序设计例例4-7设30H单元为首址的内部RAM中存有一个数表,长度为50字节。
要求顺序检索出一个关键字“$“(ASCII码为24H),若有则将特征值00H存入20H单元,若无则将特征值0FFH存入20H单元。
MOVR7,#50MOVR0,#30HLOOP:
CJNER0,#24H,NEXTMOV20H,#00HSJMPEXITNEXT:
INCR0DJNZR7,LOOPMOV20H,#0FFHEXIT:
SJMP$循环程序设计循环程序设计2、多重循环程序设计多重循环:
一个循环程序的循环体中还包含一个或多个循环的结构多重循环结构必须层次分明,循环时从外层向内层一层层进入,从内层向外层一层层退出,两循环之间不允许交叉。
51单片机对循环嵌套重数没有限制。
例例4-9用软件实现10ms的延时,设晶振频率是12MHz。
START:
MOVR6,#10LOOP1:
MOVR7,#200LOOP:
NOPNOPNOPDJNZR7,LOOPDJNZR6,LOOP1RET循环程序设计循环程序设计四、子程序设计四、子程序设计在程序设计中会遇到多次使用同一个程序段的情况,如软件延时、代码转换、数制转换、检索与排序、函数运算等。
为了简化程序设计,可以将这些相对独立的多次使用的程序段作为子程序。
51单片机:
子程序调用和子程序返回指令。
没有规定子程序嵌套的重数,它只受堆栈空间的限制。
一般在调用子程序前需要设置子程序的入口参数和出口参数。
其参数传递方法有三种:
利用寄存器传递参数;利用寄存器间接寻址传递参数;利用堆栈传递参数。
1、利用寄存器寄存器传递参数将要传递的参数存放在工作寄存器或累加器A中以便传递给子程序或主程序。
缺点是传递参数少。
例例4-11内部RAM存有128B的ASCII码字符串,首址为30H。
要求将该字符串中的每个字符按偶校验在最高位加偶校验位。
试以调用程序的方法来实现。
例4-11MOVR0,#30HMOVR7,#128LOOP:
MOVA,R0LCALLSUB1MOVR0,AINCR0DJNZR7,LOOPSJMP$SUB1:
ADDA,#0;利用累加器A传递参数。
在A的最高位加奇;偶校验位JNBP,EXITORLA,#80HEXIT:
RET子程序设计子程序设计2、用寄存器间接寻址寄存器间接寻址方法传递参数用数据地址指针来指出数据的位置。
如果参数在内部RAM中,可用R0、R1作指针;若存放在外部RAM中,可用R0、R1或DPTR作指针。
这种方法可实现数据长度可变的运算,并大大节省了参数传递中的工作量。
子程序设计子程序设计例例4-13设内部RAM中存有一ASCII字符串,长度不超过127B,起始地址放在调用程序的R0中,字符串结束标志为“#”(ASCII码值为23H),试设计一个确定ASCII码字符串长度的子程序。
要求将得到的长度值放入R1为地址指针的内部RAM单元中,作为出口参数。
子程序:
SUB:
MOVR7,#00HLOOP:
MOVA,#23HCLRCSUBBA,R0JZLOP1INCR0INCR7SJMPLOOPLOP1:
MOVA,R7MOVR1,ARET子程序设计子程序设计3、利用堆栈传递参数调用前可把子程序的入口参数压入堆栈。
被调用的子程序在执行中需要间接访问堆栈获取其入口参数,并把运算结果的出口参数送回堆栈。
调用程序再通过出栈操作获取子程序的出口参数。
这种方法传递参数量大,且不必为传递这些参数分配存储单元。
例例4-15有10个字节的无符号数自栈顶起依次存放在堆栈中。
请编写一求出它们和的子程序,并存入栈顶的相邻两个单元中,先放低字节数,再放高字节数。
子程序:
SUB:
SETBRS1;设置当前工作寄存器组为第3组SETBRS0;目的是保护调用程序中的R0R7的内容不变MOVR7,#10;设置字节长度MOVR2,#0;存放和的低8位MOVR3,#0;存放和的高8位CLRC子程序设计子程序设计POP30H;先弹出断点地址POP31H;将断点地址暂存于30H、31H单元LOOP:
POPACC;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 方法