第4章 汇编语言程序设计.ppt_第1页
第4章 汇编语言程序设计.ppt_第2页
第4章 汇编语言程序设计.ppt_第3页
第4章 汇编语言程序设计.ppt_第4页
第4章 汇编语言程序设计.ppt_第5页
已阅读5页,还剩39页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 汇编语言程序设计,汇编语言源程序设计通常采用结构化设计方法, 任何复杂的程序都可分解为: 顺序结构部分 分支结构部分 循环结构部分 子程序部分,顺序结构程序是一种最简单、最基本的程序,按照程序编写的顺序逐条依次执行,直到程序结束。这是程序的最基本的形式,任何程序都离不开这种形式。,4.2 顺序结构程序设计,例1:,将片内RAM 20H单元中 的数拆成两段,每段4位, 并将其分别存入21H、 22H单元中。低4位存 在21H单元,高4位存 在22H单元,ORG0000H LJMPSTART START: MOVA,20H ;将20H单元中的数据取 到A中 ANLA,#0FH ;得到低4位

2、 MOV21H,A ;存入21H单元 MOVA,20H ;再将原数送A SWAPA ;A中高低半字节交换 ANLA,#0FH ;得到低半字节 MOV22H,A ;将拆开的高半字节存 22H单元 SJMP$ ;用于调试程序,表示程 序结束,例2:将内部RAM40H单元中的一压缩BCD数转换 为二进制数,存入41H中。,【分析】BCD码在计算机中又分为两种形式: 非压缩BCD码:1B放1位BCD码,适用于显示和输出 压缩的BCD码:1B放2位BCD码,适用于运算及存储,编程说明:把40H单元中的十位BCD乘以10再加上个位BCD数,即可实现转换,结果为一个小于64H的一字节无符号数。如40H中有一

3、个BCD数为98H,9乘以10再加上8。即 090AH+08H=62H,MOVA,40H;将BCD数的十位放A的低4位 SWAPA ANLA,#0FH MOVB,#10 MULAB;十位乘以10 ANL40H,#0FH;将BCD数的个位保留在 40H单元中 ADDA,40H;十位10加个位 MOV41H,A RET,4.3 分支结构的程序,分支结构程序的特点是程序中含有转移指令,可以根据程序要求无条件或有条件地改变程序执行顺序,选择程序流向。 编写分支结构程序的重点是确定分支条件,进而选择正确地转移指令。转移指令有三种:无条件转移、条件转移和散转。,1无条件转移 它的程序转移方向是设计者事先安

4、排的,与已执行程序的结果无关,使用时只需给出正确的转移目标地址或偏移量即可,如: ORG0000H LJMPMAIN ORG0030H MAIN: ,2条件转移 它是根据已执行程序对标志位或累加器或对内部RAM某位的影响结果,决定程序的走向,形成各种分支。在编写有条件转移语句时要特别注意以下两点: (1)在使用条件指令形成分支前,一定要安排可供条件转移指令进行判别的条件。如若采用“JC rel”指令,在执行前必须使用影响C标志的指令;若采用“CJNE A,#data,rel”指令,在执行此程序前必须使用改变累加器A内容的指令,以便为测试准备条件。 (2)要正确选定所用的转移条件和转移目标地址。

5、,3散转 它是根据某种已输入的或运算的结果,使程序转向各个处理程序中去。MCS-51单片机具有一条专门的散转指令JMP A+DPTR,散转指令的操作是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,即散转的目的地址。,【例4.3】编制程序使y按下式赋值:,分支程序设计举例,VAR EQU30H FUNC EQU31H START:MOVA,VAR;取x JZCOMP;为0转COMP JNBACC.7,POSI;0转POSI MOVA,#0FFH;0,-1A SJMPCOMP POSI:MOVA,#01H COMP:MOVFUNC,A RET,在片内R

6、AM40和50H单元开始各存放有一个双字节数(高8位在偶地址)无符号数,编程比较其大小,把xiao数送片内RAM70H、71H单元。,MOVA,41H CLR C SUBBA,51H MOV A,40H SUBBA,50H JC L1 MOV 70H,50H MOV 71H,51H SJMP L2,L1:MOV 70H,40H MOV 71H,41H L2:RET,散转程序设计举例 散转指令的操作是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,即散转的目的地址。 散转程序的设计可采用下面两种方法: (1)数据指针DPTR固定,根据累加器A的内容,程

7、序转入相应的分支程序中去。 (2)累加器A清零,根据数据指针DPTR的值,决定程序转向的目的地址。DPTR的值可以用查表或其他方法获得。,例44 设计128路分支的转移程序。设128个出口地 址分别为:subrut00、subrut01、subrut7F; 要转移的出口信息放在工作寄存器R3中。注意出口信 息是0127之间的整数。,MOVA,R3 RLA;将出口信息乘以2 MOVDPTR,#TAB JMPA+DPTR TAB: AJMPsubrut00 ;128个子程序首址 AJMPsubrut01 AJMPsubrut7F,(1)采用转移指令表,由于AJMP指令为两个字节指令,整个入口地址表

8、占用256字节。每两条相邻AJMP指令的首址相差两个字节,因此在第二条指令中将出口信息乘以2,可正确实现查表与转移。该程序要求128个转移目的地址(subrut00subrut7F)必须驻留在与绝对转移指令AJMP同一个2KB存储区内。如果各个转移小程序较长,超过2K字节,应改用LJMP指令,目的地址可以任意安排在64K字节空间的程序存储器空间内,但程序应作相应的修改。,(2) 利用转向地址表实现转移 这种方法将转移地址列成表格,将表格的内容作为转 移的目标地址。 【例】根据R3(0n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0PRn(n256) 【分析】 将PR0 PRn入口地

9、址列在表格中,每一项占两个单元; PRn在表中的偏移量为2n,因此将R3的内容乘“2”即得PRn在表中的偏移地址; 从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和低8位地址送DPTR寄存器,用JMP A+DPTR指令(A先清零)即转移到PRn入口执行。,PR0EQU0110H PR1EQU0220H PR2EQU0330H ORG0030H KEY_JMP:MOVDPTR, #TAB MOVA,R3 ADDA,R3;(A)(R3)*2 JNCNADD INCDPH;(R3*2)256,NADD: MOV R3,A MOVC A, A+DPTR XCH A, R3 ;转移地址高8位

10、 INCA MOVCA, A+DPTR MOVDPL,A;转移地址低8位 MOVDPH, R3 CLRA JMPA+DPTR TAB: DW PR0,PR1,PR2, PRn PR0:处理程序0 PR1:处理程序1 PRn:处理程序n END,44 循环结构的程序,循环程序是强制CPU重复执行某一指令序列的一种程序结构形式。 凡是遇到需要重复操作的程序,这时可用循环程序结构。 循环结构程序简化了程序书写,减少了内存占用空间。 循环结构的程序一般由5部分组成:初始化,循环体、循环修改、循环控制和结束部分。,例 工作单元清0。 设有50个工作单元,其首址存放在DPTR中,循环次数存放在R2寄存器中

11、,每执行一次循环,R2的内容减1,直至R2=0,循环程序结束。,CLEAR:CLRA MOVR2,#32H;置计数器 LOOP: MOVXDPTR,A INCDPTR;修改地址指针 DJNZ R2,LOOP;控制循环 RET,例 多个单字节数据求和 求无符号数累加和 。若 均为单字节数,并按i(i=1n)顺序存放在片内RAM从60H开始的单元中,n放在R2中,要求它们的和(双字节),放在R3R4中。,ORG0000H AJMPADD1 ORG0100H ADD1:MOVR3,#00H;部分和高字节清零 MOVR4,#00H;部分和低字节清零 MOVR2,#8;数据个数送R2 MOVR0,#60

12、H;数据首址送R0 LOOP:MOVA,R4;取部分和低位 ADDA,R0;与Xi相加 MOVR4,A;存部分和 CLRA;将A清零 ADDCA,R3;部分和高字节加进位 MOVR3,A;存部分和 INCR0 ;地址加1 DJNZR2,LOOP;未加完继续重复 END,多重循环程序设计 设片内RAM 30H开始的单元有无序字符表,假设为10个字节,将其按代码值从小到大的顺序依次排列在这片单元中。 编程说明:采用冒泡法,从30H开始,相邻两数逐次进行比较,把大值元素向下交换直到表尾,称为一次冒泡,且只要有地址单元内容的互换就置位标志。以后重复冒泡排序,直到最小元素冒到顶部为止(标志是一次冒泡排序

13、中不再出现单元互换的情况),ORG 0000H START:CLR 00H CLR C MOVR7,#09H ;比较次数 MOVR0,#30H MOVA,R0 LOOP:INCR0 MOVR2,A SUBBA,R0 MOVA,R2 JCNEXT SETB00H,XCHA,R0 DECR0 MOVR0,A INCR0 NEXT:MOV A,R0 DJNZR7,LOOP JB00H,START SJMP$,45 查表程序,查表法是对一些复杂的函数运算如sinx等,事先把其全部可能范围的函数值按一定的规律编成表格存放在计算机的程序存储器中。当用户程序中需要用到这些函数时,直接按编排好的索引值(或程序

14、号)寻找答案。 在控制应用场合或智能仪器仪表中,经常使用查表法。 这种方法的不足是要占用较多的存储单元。,为了实现查表功能,在MCS-51单片机中专门设置了两条查表指令: MOVCA,A+DPTR,MOVCA,A+PC,例1已知数据09的平方,设变量x的值在累加器A中, 查表后求x2的值放回累加器,试编制程序。,ORG 0100H SQR1: MOV DPTR,#TABLE MOVC A,A+DPTR RET TABLE:DB00,01,04,09,16 DB25,36,49,64,81,ORG 0100H SQR2:INC A MOVC A,A+PC RET TABLE:DB00H,01H,

15、04H,09H,16H DB25H,36H,49H,64H,81H,例2某智能化仪器的键盘程序中,根据命令的键值(0 、1、2、9)转换成相应的双字节16位命令操作 入口地址,其键值与对应入口地址关系如下: 键值 0 1 2 3 4 5 6 入口地址 0123H 0186H 0234H 0316H 0415H 0520H 0626H 键值 7 8 9 入口地址 0710H 0818H 0929H 设键值存放在片内RAM20H单元中,对应入口地址值 存放在片内RAM22H和23H中。,ORG 0200H MOV DPTR,#TAB MOV A,20H RL A MOV 20H,A MOVC A,

16、A+DPTR MOV 22H,A INC DPTR MOV A,20H MOVC A,A+DPTR MOV 23H,A,MOV DPL,23H;转移地址低8位 MOV DPH, 22H CLRA JMPA+DPTR RET TAB:DB01H,23H DB09H,29H,46 子程序设计,在实际问题中,常常会遇到在一个程序中有许多相同的运算或操作,例如多字节的加、减、字符处理等。如果每遇到这些运算和操作,都从头做起,则使程序非常繁琐且浪费内存。 因此在实际应用中,通常把这些多次使用的程序段,按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。 通常将这种可以被调用的程序段称

17、为子程序。 调用子程序的程序称为主程序。 使用子程序的过程称为调用子程序; 子程序执行完毕后返回主程序的过程称为子程序返回。,1 子程序结构与设计注意事项 (1)要给每个子程序赋一个名字,实际上是一个入口地址的代号。 (2)要能正确地传递参数。有入口条件和出口条件 (3)注意保护现场和恢复现场。 (4)为了使子程序具有一定的通用性,子程序中的操作对象,应尽量用地址或寄存器形式,而不用立即数。另外,子程序中如含有转移指令,应尽量用相对转移指令,以便它不管放在内存中的哪个区域,都能正确执行。,2.主程序在调用子程序时要注意以下问题: (1)在主程序中,要安排相应指令,满足子程序的入口条件,提供子程

18、序的入口数据。 (2)在主程序中,不希望被子程序更改内容的寄存器,也可在调用前在主程序中安排压栈指令保护现场,子程序返回后再安排弹出指令恢复现场。 (3)在主程序中,安排相应的指令,处理子程序提供的出口数据。 (4)在需要保护现场的程序中,要正确地设置堆栈指针。,子程序应用设计举例,1.用程序实现c=a2+b2。设a、b均小于10,a存在片 内RAM31H单元中,b存在32H单元中,把c存入33H 单元中。,求平方子程序 SQR:MOVDPTR,#TAB MOVC A,A+DPTR RET TAB:DB 0,1,4,9,16,25,36,49,64,81,主程序: ORG0030H MOVSP

19、,#60H MOVA,31H LCALLSQR MOVR1,A MOVA,32H LCALLSQR ADDA,R1 MOV33H,A L:SJMPL,2.求两个无符号数据块中的最大值。数据块的首地址 分别为片内RAM60H和70H,每个数据块的第1个字 节都存放数据块的长度,结果存入5FH单元。 分析:本例可采用分别求出两个数据块的最大值,然后比较其大小的方法,求最大值的过程可采用子程序。子程序的入口条件是数据块首地址,返回参数即为最大值,放在A中。,子程序入口参数:R1为数据块首地址 ;子程序出口参数:A为最大值 QMAX:MOVA,R1;取数据块长度送计数器R2 MOVR2,A CLRA;设0为最大值 LP1:INCR1 CLRC SUBBA,R1 JNCLP3;原数仍为最大转LP3 MOVA,R1;否,用此数代替最大值 SJMPLP4 LP3:ADDA,R1 ;恢复原最大值 LP4:DJNZR2,LP1 RET,主程序: MOV R1,#60H;置入口参数 LCALL QMAX MOV 40H,A;最大值存40H MOV R1,#70H LCALLQMAX CJNEA,40H,NEXT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论