微机原理与应用-04汇编语言_第1页
微机原理与应用-04汇编语言_第2页
微机原理与应用-04汇编语言_第3页
微机原理与应用-04汇编语言_第4页
微机原理与应用-04汇编语言_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第4章89C51汇编语言设计主要内容汇编语言程序设计概述汇编语言源程序的汇编实用程序设计简单程序设计分支程序设计循环程序设计散转程序设计子程序设计查表程序§4-1汇编语言的基本概念

一.程序设计语言机器语言汇编语言高级语言1.机器语言用二进制代码表示指令、数字和符号。能被计算机直接识别执行,响应速度最快。难认、难记、易错、可读性差。

2.汇编语言面向机器的符号语言,指令用助记符表示;指令直接访问CPU的寄存器、存储单元和I/O端口,响应速度快,程序的存储空间利用较高;汇编语言是面向机器的语言,因此使用者必须对机器的硬件结构和指令系统比较熟悉。汇编语言的汇编汇编:汇编语言程序到机器语言程序的转换过程。(1)人工编译

汇编机器语言目标程序汇编语言源程序人工查指令机器代码表十分繁锁,且容易出错,程序的修改比较困难(2)机器汇编用机器汇编,方便快捷,并能在汇编过程中发现语法错误。汇编机器语言目标程序汇编语言源程序汇编程序Medwin汇编环境示例源程序的汇编结果实例3.高级语言是以接近人的常用语言形式编写程序的语言总称,是一种独立于机器的通用语言。用高级语言编写程序与人们通常的解题步骤接近。程序的可读性好,必须经编译程序或解释程序进行翻译生成目标程序,才能执行。处理接口技术和中断技术比较困难,不适合实时控制。二.汇编语言的格式

1.汇编语言的指令类型可执行指令:由机器能够执行的指令,生成二进制目标代码如MOVA,#30H<=>伪指令:提供程序汇编过程中必要控制信息的指令,不生成目标代码

如:ORG0100H宏指令语句:用以代替汇编语言源程序中重复使用的程序段的一种语句,由汇编程序在汇编时产生相应的目标代码74H30H2.汇编语言的指令格式(4分段)[标号:]操作码[操作数][;注释]例:把片外RAM2200H单元中的数送入片内70H单元中。标号域操作码域操作数域注释域BEGIN:MOVDPTR,#2200H;(DPTR)=2200HMOVR0,#70H;(R0)=70HMOVXA,@DPTR;(A)=((DPTR))MOV@R0,A;((R0))=(A)1、标号字段后必跟“:”号;首字符必是字母,由1~8个ASCII码字符组成;同一标号在一个程序中只能定义一次;不能使用指令助记符、伪指令、寄存器的符号名称;一条语句的标号可有可无,取决于本程序的其他语句是否访问该条语句。2、操作码字段:不能空缺3、操作数字段:单、双、无操作数双操作数用逗号隔开十进制数、十六进制数、

二进制数的表示工作寄存器和SFR的表示$符号的使用:

JNBF0,$<=>HERE:JNBF0HERESJMP$<=>HERE:SJMPHERE4、注释字段:可有可无;使用时或换行时以“;”开头§4-2汇编语言源程序的汇编

1.伪指令伪指令是非执行指令,在汇编过程中起控制作用设置目标程序设置数据块的起始地址分配存储单元定义符号(1)ORG定义起始地址程序中可有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。必须从小地址向大地址分配程序所占空间。(2)END定义汇编结束格式:END功能:表示汇编到此结束注意:在END命令后面的源程序不被汇编处理示例:ORG0000LJMP0100ORG0100HStart:MOVA,#5AHSJMP$END(3)EQU标号赋值格式:标号/字符串名

EQU<表达式>功能:经赋值后的标号或字符串名,可作为地址或数据在其它指令中使用,可是8位或16位。(4)DB定义字节ORG1000HDat:DB11H,-1,’A’,’BCD’END1000H11HFFH41H42H43H44H程序存储器补码ASCII码‘’该指令只能为ROM赋初值,不能为其他存储器赋初值,尤其不能为内部RAM赋初值。格式:[标号:]DB字节常数表功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节(8位)、数或以引号括起来的字符串。(5)DW定义字格式:[标号:]DW字常数表功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节16位)

。高字节存入低地址单元,低字节存入高地址单元只对ROM起作用(5)DW定义字例.

伪指令应用

ORG8100H DW“AB” DW100H,1ACH说明

(1)(8100H)=41H(‘A’)(8101H)=42H(‘B’)

(2)8102H单元起存放01H、00H、01H、ACH§4-3汇编语言设计实例程序设计流程分析问题,确定算法根据算法,画出程序框图分配内存工作区及有关端口地址按流程图编写程序上机汇编、调试、修改及最后确定源程序程序流程符号端点框处理框判断框子程序框连接符流程线1.顺序结构程序顺序程序又称为简单程序,是一种最简单、最基本的程序结构。特点:是依次执行程序中的每一条指令,直到最后一条指令。练习1.编写一个子程序,将寄存器R0中的内容*10(积<256)2.R1中存有一压缩的BCD码,请编程将其转换为ASCII码,存入外RAM1000H单元中

设(59H)=50H;MOVA,59HMOVR0,AMOVA,#00HMOV@R0,AMOVA,#25HMOV51H,AMOV52H,#70H求:A=;(50H)=;(51H)=;(52H)=;25H

00H25H70H练习答案1.编写一个子程序,将寄存器R0中的内容*10(积<256).解:START:MOVA,R0MOVB,#10MULABMOVR0,ARET2.R1中存有一非压缩的BCD码,请编程将其转换为ASCII码,存入外RAM1000H单元中。解:BTAS:MOVA,R1ORLA,#30HMOVDPTR,#1000HMOVX@DPTR,ARET提示:0~9的ASCII码为30H~39H3.

存放在40H单元的压缩BCD码转换为ASCII码,并存入内存RAM的31H,30HORG2000HSTART:MOVA,40HANLA,#0FH;屏蔽高四位

ADDA,#30H;转换成ASCII码

MOV30H,AMOVA,40HSWAPA;高低四位互换

ANLA,#0FH;保留高位BCD码

ORLA,#30H;转换成ASCII码

MOV31H,A2.子程序设计子程序是能完成某项特定功能的独立程序段,可被反复调用。SUBR子程序可以嵌套,通常情况下8层。(1)子程序结构MAIN:……

;主程序

LCALLSUB

;调用子程序

……SUB:PUSHPSW

;现场保护

PUSHA

子程序处理程序段

POPA

;现场恢复

POPPSWRET1.子程序应取名,即子程序的入口加标号;2.子程序调用指令:ACALLaddr11LCALLaddr163.堆栈保护现场(PUSH)和恢复现场(POP);4.子程序设计要考虑参数的传递,即要满足入口条件和出口状态;5.子程序结尾必须是返回指令RET。(2)子程序的参数传递设计子程序应满足通用性要求,不针对具体数据编程。由主程序提供给子程序的参数为入口参数,由子程序返回主程序的参数为出口参数。如:1.子程序功能为求单字节数的立方:

A←A3,入口参数和出口参数为A。

2.子程序功能为求单字节数的n次方: (41H)(42H)←(40H)A,入口参数为(40H)和A,出口参数为(42H)(41H)。(2)子程序的参数传递

a.利用寄存器(R0~R7和A)传递参数MAIN:……MOVR0,#30HMOVR7,#0AHACALLZERO……ZERO:MOVA,#00HLOOP:MOV@R0,AINCR0DJNZR7,LOOP子程序名:Zero功能:对内部数据区清零入口参数:

R0内部数据区

R7内部数据区长度出口参数:无占用资源:A,R0,R7主程序用PUSH指令将入口参数压入堆栈,进入子程序后通过POP指令间接访问堆栈中的参数。子程序可用堆栈将出口参数传递给主程序。注意:

ACALL、LCALL指令断点地址自动进栈,RET指令自动弹出断点地址。(2)子程序的参数传递

b.通过堆栈传递参数数据区清零,起始地址放在70H,被清零单元个数放在71HORG0100HMain:MOVSP,#5FHMOV70H,#40HMOV71H,#10HPUSH70HPUSH71HLCALLZeroSJMP$ZERO:POPDPHPOPDPLPOP07H;R7POP00H;R0CLRALOOP:MOV@R0,AINCR0DJNZ,R7,LOOPPUSHDPLPUSHDPHRETEND子程序名:Zero功能:对内部数据区清零入口参数:

70H内部数据区地址

71H内部数据区长度出口参数:无占用资源:R0,R7,70H,71H内部RAM5F60H40H61H10H62HPCL63HPCHSP→输出字符较多的打印子程序,遇00H停止打印

ORG0000HMain:MOVSP,#6FHLCALLPRINTDB‘THISISAN’DB’EXAMPLE’DB0AH,0DH,00HNEXT:……PRINT:POPDPHPOPDPLPPP1:MOVA,#00HMOVCA,@A+DPTR

INCDPTRJZPPPENDPPP2:(打印程序)…….SJMPPPP1PPPEND:JMP@A+DPTR(2)子程序的参数传递

c.利用数据指针传递例比较两个数据串是否完全相等,若完全相等,A=0;否则A=FFH。PMT:MOV R2,A ;设数串长度CHC:MOV A,@R0;各取数串中的一个数

MOV 42H,@R1 CJNE A,42H,NOM;是否相等?不相等转移

INC R0 ;相等,修改指针

INC R1 DJNZ R2,CHC ;全部比较完?

MOV A,#0 ;完全相等

SJMP PENDNOM:MOV A,#0FFH ;不完全相等PEND:RET3.查表程序设计事先将计算或实验数据按一定顺序编成表格,存于ROM内,然后根据输入的参数值,从表中取得结果。查表指令:

MOVCA,@A+DPTRMOVCA,@A+PCMOVCA,@A+DPTR数据表头地址存入DPTR要查得的数在表中相对表头的偏移量送入A,可在64KB内查表MOVCA,@A+PC用传送指令把所查数据的项数送入累加器A;使用ADDA,#data,修正A,data值=查表指令和数据表格间的字节数;data=数据表头地址-PC当前值

=数据表头地址-(查表指令PC值+1)用指令MOVCA,@A+PC完成查表例根据A的值查表找出对应的ASCII码7402240383F880FE30313233MOVA,#02H;ADDA,#03H;MOVCA,@A+PCMOVR0,ASJMP$‘0’表头‘1’‘2’‘3’2000200120022003200420052006200720082009200A2008例如:查找‘2’的ASCII码偏移量=2008-2004-1=33B偏移量=表头地址

-MOVC指令值PC–1例

根据R2中的值查表找出对应的值

MOVA,R2ADDA,R2;R2*2MOVR3,A

ADDA,#07HMOVCA,@A+PCXCHA,R3

ADDA,#03+1MOVCA,@A+PCMOVR4,ASJMP$TAB1:DW1520H……012345152075862345100008839943TAB11B2B1B1B2B7B3BR2y=f(R2)4.分支结构程序设计分支程序的基本形式用条件转移语句实现二分支用CJNE实现三分支用JMP@A+DPTR实现多分支(1)用条件语句实现二分支根据不同的条件,执行不同的程序段。JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正确合理地运用例

:求补码,双字节原码放在30H和31H,补码存放在32H和33H思路:原码形式的正数,其补码同原码。原码形式的负数,其补码等于其反码加1

MOVA,30HJNBACC.7,NN;判断原码符号S:ANLA,#7FH

;求原码负数绝对值

CPLA;求原码的补码(模-1-原码负数绝对值)

MOV32H,AMOVA,31HCPLAADDA,#1HMOV33H,AMOVA,32HADDCA,#0HMOV32H,AAJMPNEGTNN:MOV32H,AMOV33H,31HNEGT:SJMP$END(2)用CJNE实现三分支≠?Cy=0?语句组1语句组2语句组3入口YesYesNoNoCJNE出口或CY=1?例:编程实现y=(R0)x(R1)y2、判正负CJNER0,#0,ZEROCLRCMOVA,R0SUBBA,#0JZZEROMOVA,R0JZZERO1、判零三种方法MOVA,R0JNBACC.7,positive

CJNER0,#0,MP1MOVR1,#0

SJMPMP3MP1:MOVA,R0JNBACC.7,MP2MOVR1,#0FFH

SJMPMP3MP2:MOVR1,#01HMP3:SJMP$ENDy=(R0)x(R1)y判正负判零分支间隔离开始结束y0y-1y+1x=0?x<0?YYNNCJNEMP3MP1JNBMP2例:教材p72例4-12多路分支程序根据某变量的内容,分别转入处理程序0、处理程序1…处理程序n。通过散转指令JMP@A+DPTR实现根据R2值,转入不同的处理程序R2=0,

转PRG0:

R2=2,

转PRG1;……R2=3,转PRGn2编程提示

LJMP是3字节的指令

A是否能够放得下变址数据5.循环程序设计将片外RAMl000H开始的10个单元清零循环程序的结构循环初始化:地址指针、循环次数、寄存器循环体:要求重复执行的程序段部分循环控制:修改地址指针、循环变量、循环判终计数循环结构示意图条件循环结构示意图例:数据块求和设有20个单字节数,存放在RAM从30H开始的单元中,求累加和(双字节),存放在60H、61H单元参考源程序例:寻找最大值设一个无符号的数据块,起始地址为片外RAM3000H,其长度未知,只知道结束字节为00H。求这个数据块中的最大值,结果存入片内RAM的MAX单元。条件循环结构参考源程序课堂练习编写程序实现两个4位BCD数相加,设被加数存放在内部RAM40H和41H单,加数存放在45H和46H单元,和数存入50H和51H单元,并设最高位不产生进位。欲将片外数据存储器中7000H一70FFH单元全部清零?求内部RAM中的50H~5AH中的最大值并放入5AH单元。课堂练习1参考程序课堂练习2参考程序课堂练习3参考程序4.4汇编语言应用程序的开发与调试汇编语言程序需要调试,89C51没有程序编辑、调试功能,也不能实现硬件电路的诊断、调试。借助开发工具模拟单片机,观察程序运行过程——单片机仿真开发系统。4.4.1仿真开发系统简介1、仿真开发系统的功能用户样机硬件电路的诊断、检查;用户样机程序的输入与修改;程序的运行、调试(单步、设置断点)、排错、状态查询;将程序写入ROM中4.4.1仿真开发系统简介完善的仿真开发系统的功能还有:较全的开发软件:可用C语言编程、可编译程序连接生成目标文件和可执行文件、可用汇编语言编程、反汇编功能、丰富的子程序可供调用。有跟踪调试、

温馨提示

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

评论

0/150

提交评论