MCS-51单片机指令系统及汇编语言程序设计_第1页
MCS-51单片机指令系统及汇编语言程序设计_第2页
MCS-51单片机指令系统及汇编语言程序设计_第3页
MCS-51单片机指令系统及汇编语言程序设计_第4页
MCS-51单片机指令系统及汇编语言程序设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第3章MCS-51单片机指令系统及汇编语言程序设计程序设计概述MCS-51单片机的寻址方式MCS-51单片机分类指令伪指令MCS-51单片机汇编语言程序设计根底汇编语言程序设计的一般步骤

①分析问题,抽象出描述问题的数学模型;②确定解决问题的算法或解题思想;③绘制流程图和结构图;④分配存储空间和工作单元;⑤编制程序;⑥程序静态检查,上机调试;⑦编写相关说明。单片机程序设计语言有三类:

①机器语言;②汇编语言;③高级语言3.1程序设计概述汇编语言指令格式MCS-51汇编语言的语句格式应符合以下结构:【标号:】操作码【操作数】【;注释】①汇编语言语句由标号、操作码、操作数和注释4局部组成。其中,标号和注释局部可以没有,甚至某些指令的操作数也可以没有,如NOP、RET指令等。②标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之间可以有空格。③操作码是指令的助记符。④操作数在操作码之后,二者用空格分开。操作数可以是数据,也可以是地址。有多个操作数时,操作数之间用逗号分开。⑤注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。指令中的数据可以是十进制、十六进制、二进制、八进制数和字符串,具体格式如下:●十进制数以D结尾,也可以省略,如55D或55;●十六进制数以H结尾,如55H。如果数据以A~F开头,其前必须加数字0,如#0FFH;●二进制数以B结尾,如00110011B;●八进制数以O或Q结尾,如55O或55Q;●字符串用’’或””表示,如‘M’表示字符M的ASCII码。例:MAIN:MOVA,#00H;将A清零在这条指令中,MAIN为标号,表示该指令的地址;MOV为操作码,表示指令的功能为数据传送;A和#00H为操作数;将A清零为注释,用于说明这条语句的功能,注释内容不参与程序的汇编。3.2MCS-51单片机的寻址方式MCS-51单片机共有7种寻址方式:立即寻址直接寻址存放器寻址存放器间接寻址变址寻址相对寻址位寻址1.立即寻址立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中。立即操作数有8位和16位两种形式,前面加“#”来表示。例如:MOVA,#0FFH;将立即数FFH传送到累加器A中MOVDPTR,#2000H;将16位立即数2000H传送到数据指针DPTR中MOV40H,#60H;将立即数60H传送到40H内部RAM单元中2.直接寻址

指令中直接给出操作数地址的寻址方式。例如:MOVA,30H;内部RAM中的30H单元中的数据内容传送到累加器A中3.存放器寻址以通用存放器的内容为操作数的寻址方式。通用存放器包括:A,B,DPTR,R0~R7。其中,R0~R7必须在工作存放器组之中。例如:INCR0;〔R0〕+1→R0

需要注意的是,A和B既是通用存放器,又是具有直接地址的特殊功能存放器。4.存放器间接寻址以存放器中的内容为地址,该地址中的内容为操作数的寻址方式。能够用于存放器间接寻址的存放器有:R0,R1,DPTR,SP。其中,R0,R1必须在工作存放器组之中,SP仅用于堆栈操作。例如:MOVXA,@R1;外部数据RAM中地址为P2R1的单元内容→AMOVX@DPTR,A;A→外部数据RAM中DPTR为地址的单元存放器间接寻址的存储器空间包括:内部数据RAM和外部数据RAM。内部数据RAM共用128字节,用一个字节的R0或R1可寻址整个空间。外部数据RAM最大可达64K字节,仅用R0或R1无法寻址整个空间。在MCS-51系列单片机指令中,对外部数据RAM作间接寻址有两种方法:第一种由P2口提供高8位外部数据RAM地址,由R0或R1提供低8位地址,由此共同寻址64K空间;第二种是用16位的DPTR作存放器间接寻址。5.变址寻址由程序计数器PC或DPTR加上偏移量存放器A中内容之和形成操作数地址的寻址方式。变址寻址只能对程序存储器中的数据作寻址操作。由于程序存储器是只读存储器,因此变址寻址操作只有读操作而无写操作。例如:MOVCA,@A+DPTR;A+DPTR为地址的存储器单元内容→AMOVCA,@A+PC;A+PC为地址的存储器单元内容→A6.相对寻址以当前程序计数器PC的内容为基址,加上指令给出的一字节补码数形成新的PC值的寻址方式。PC中的当前值称为基地址,一字节补码数称为偏移量,新的PC值称为转移目的地址。例如:JC80H;C=1跳转表示进位位C为0,那么程序计数器PC中的内容不改变,即不转移。假设进位位C为1,那么PC中的当前值为基地址加上偏移量80H后所得到的结果作为该转移指令的目的地址。7.位寻址对位地址中的内容作位操作的寻址方式。单片机中只有内部RAM〔20H~2FH单元〕和特殊功能存放器的局部单元有位地址〔两者统一编址,地址空间为00H~FFH〕,因此,位寻址只能对有位地址的这两个空间作寻址操作。例如SETB20H;1→20H位MOV32H,C;进位位C→32H位3.3分类指令MCS-51单片机共有111条指令,按功能分类,MCS-51指令系统可分为5大类:数据传送类指令〔共29条〕算术操作类指令〔共24条〕逻辑操作类指令〔共24条〕控制转移类指令〔共17条〕布尔变量操作类指令〔共17条〕1.数据传送类指令〔共29条〕以累加器A为目的操作数类指令〔4条〕MOV

A,directMOV

A,#dataMOV

A,Rn

MOV

A,@Ri例:R1=20H,〔20H〕=55H,指令MOV

A,@R1执行后,A=55H。以存放器Rn为目的操作数的指令〔3条〕MOV

Rn,direct

MOV

Rn,#dataMOV

Rn,A例:〔40H〕=30H,指令MOVR7,40H执行后,R7=30H。以直接地址为目的操作数的指令〔5条〕MOV

direct,directMOV

direct,#dataMOV

direct,AMOV

direct,RnMOV

direct,@Ri例:R0=50H,〔50H〕=10H,指令MOV35H,@R0执行后,(35H)=10H。以间接地址为目的操作数的指令〔3条〕MOV

@Ri,directMOV

@Ri,#dataMOV

@Ri,A查表指令〔2条〕MOVC

A,@A+DPTRMOVC

A,@A+PC例:A=20H,DPTR=2000H,指令MOVC

A,@A+DPTR执行后,程序存储器2020H单元中的内容送入A。累加器A与片外数据存储器RAM传送指令〔4条〕MOVX

@DPTR,AMOVX

A,@DPTR

MOVX

A,,@Ri

MOVX

@Ri,A例:DPTR=2000H,外部RAM中〔2000H〕=18H,指令MOVX

A,@DPTR执行后,A=18H。例:P2=10H,R1=50H,A=64H,指令MOVX

@R1,A执行后,外部RAM中〔1050H〕=64H。堆栈操作类指令〔2条〕PUSH

direct

POP

direct例:SP=07H,〔35H〕=55H,指令PUSH35H执行后,55H送入08H地址单元,SP=08H。交换指令〔5条〕XCH

A,Rn

XCH

A,@RiXCH

A,directXCHD

A,@RiSWAP

A例:A=80H,R0=32H,〔32H〕=FFH,指令XCHD

A,@R0执行后,A=8FH,〔32H〕=F0H。16位数据传送指令〔1条〕MOV

DPTR,#data16

2.算术操作类指令〔共24条〕算术运算指令共有24条,算术运算主要是执行加、减、乘、除、增量、减量和十进制调整等指令。加法指令〔4条〕ADD

A,#dataADD

A,directADD

A,RnADD

A,@Ri带进位加法指令〔4条〕ADDC

A,direct

ADDC

A,#data

ADDC

A,Rn

ADDC

A,@Ri

带借位减法指令〔4条〕SUBB

A,direct

SUBB

A,#data

SUBB

A,Rn

SUBB

A,@Ri

例:A=38H,R1=20H,〔20H〕=23H,C=1,指令SUBB

A,@R1执行后,A=14H

乘法指令〔1条〕MUL

AB例:A=50H,B=A0H,指令MUL

AB执行后,A=00H,B=32H除法指令〔1条〕

DIV

AB例:A=28H,B=12H,指令DIV

AB执行后,A=02H,B=04H

加1指令〔5条〕INC

A

INC

direct

INC

@Ri

INC

Rn

INC

DPTR

减1指令〔4条〕DEC

A

DEC

direct

DEC

@Ri

DEC

Rn

十进制调整指令〔1条〕DA

A;把A中按二进制相加后的结果调整成按BCD数相加的结果3.逻辑操作类指令〔共24条〕逻辑操作类指令共有24条,主要包括“与”、“或”、“异或”、求反、清0、左右移位等逻辑操作。“与”操作指令〔6条〕ANL

A,direct

ANL

A,#data

ANL

A,Rn

ANL

A,@Ri

ANL

direct,A

ANL

direct,#data

“或”操作指令〔6条〕ORL

A,direct

ORL

A,#data

ORL

A,Rn

ORL

A,@Ri

ORL

direct,A

ORL

direct,#data

例:〔21H〕=3AH,A=14H,指令ORL21H,A执行后,〔21H〕=3EH。“异或”操作指令〔6条〕XRL

A,direct

XRL

A,#data

XRL

A,Rn

XRL

A,@Ri

XRL

direct,A

XRL

direct,#data

例:R0=23H,〔23H〕=32H,A=53H,指令XRL

A,@R0执行后,A=61H求反指令〔1条〕

CPL

A

;累加器A中的内容按位取反清零指令〔1条〕

CLR

A

;0→A,累加器A中的内容清零循环移位指令〔4条〕

RL

A

;累加器A中的内容左移一位

RR

A

;累加器A中的内容右移一位

RLC

A

;累加器A中的内容连同进位位C左移一位

RRC

A

;累加器A中的内容连同进位位C右移一位

例:A=16H,指令RR

A执行后,A=0BH。4.控制转移类指令〔共17条〕控制转移类指令共有17条,用于控制程序的流向,所控制的范围即为程序存储器区间。子程序调用指令〔4条〕绝对调用指令ACALL

addr11

绝对调用指令实现在2K地址范围内的子程序调用。本指令实现的操作将不改变原PC的高5位,仅把11位地址addr11送入PC的低11位,以此确定子程序的入口地址。由于整个64K程序存储器空间被分成32个根本2K地址范围〔见表3.4〕,编程时,必须保证紧接ACALL指令后面的那一条指令的第一字节与被调用子程序的入口地址在同一2K范围内,否那么将不能使用ACALL指令实现这种调用。表3.4程序存储器空间中的32个根本2K地址范围0000H~07FFH5800H~5FFFHB000H~B7FFH0800H~0FFFH6000H~67FFHB800H~BFFFH1000H~17FFH6800H~6FFFHC000H~C7FFH1800H~1FFFH7000H~77FFHC800H~CFFFH2000H~27FFH7800H~7FFFHD000H~D7FFH2800H~2FFFH8000H~87FFHD800H~DFFFH3000H~37FFH8800H~8FFFHE000H~E7FFH3800H~3FFFH9000H~97FFHE800H~EFFFH4000H~47FFH9800H~9FFFHF000H~F7FFH4800H~4FFFHA000H~A7FFHF800H~FFFFH5000H~57FFHA800H~AFFFH长调用指令LCALL

addr16

长调用指令为64K程序存储器空间中的全范围子程序调用指令,子程序的入口地址可在64K地址空间中的任一处。子程序返回指令

RET

从被调用子程序返回,与LCALL与ACALL指令配合使用。中断返回指令

RETI

从中断效劳程序中返回,除具有RET功能外,还具有恢复中断逻辑的功能,需注意的是,RETI指令不能用RET代替。转移类指令〔12条〕转移类指令分为无条件转移指令和条件转移指令两组。无条件转移指令包括绝对转移、长转移、短转移和间接转移;条件转移指令包括结果为零、结果为非零、减“1”后结果为非零以及两数不相等的转移条件等,它们全部采用相对转移的方式。无条件转移指令〔4条〕【1】长转移指令LJMP

addr16

长转移指令为64K程序存储器空间的全范围转移指令,转移地址可为16位地址值中的任一值。【2】绝对转移指令AJMP

addr11

绝对转移指令为2K地址范围内的转移指令,对转移目的地址的要求与ACALL指令中对子程序入口地址的要求相同。【3】短转移指令SJMP

rel

;PC+2+rel→PC短转移指令为一页地址范围内的相对转移指令。因为rel为1字节补码偏移量,且SJMP

rel指令为2字节指令,所以转移范围为下条指令第一字节地址的-128~+127〔或SJMP指令地址的-126~+129〕【4】间接转移指令JMP

@A+DPTR

条件转移指令〔8条〕【1】累加器为零/非零转移指令JZ

rel

假设A=0,那么PC+2+rel→PC,程序转移到偏移量所指向的地址假设A≠0,程序顺序执行

JNZ

rel

假设A≠0,那么PC+2+rel→PC,程序转移到偏移量所指向的地址假设A=0,程序顺序执行【2】两数不等转移指令〔CJNE会影响C标志位〕

CJNE

A,direct,rel

假设A≠〔direct〕,那么PC+3+rel→PC,程序转移;假设A=〔direct〕,那么程序顺序执行CJNE

A,#data,rel

假设A≠#data,那么PC+3+rel→PC,程序转移;假设A=#data,那么程序顺序执行

CJNE

Rn,#data,rel

假设Rn≠#data,那么PC+3+rel→PC,程序转移;假设Rn=#data,那么程序顺序执行CJNE

@Ri,#data,rel

假设((Ri))≠#data,那么PC+3+rel→PC,程序转移;假设((Ri))=#data,那么程序顺序执行【3】减“1”非零转移指令

DJNZ

Rn,rel

Rn-1→Rn,假设Rn≠0,那么PC+2+rel→PC,程序转移;假设Rn=0,那么程序顺序执行

DJNZ

direct,rel

(direct)-1→direct,假设(direct)≠0,那么PC+3+rel→PC,程序转移;假设〔direct)=0,那么程序顺序执行需要注意的是,DJNZ

Rn,rel是2字节指令,而DJNZ

direct,rel

是3字节指令,所以在满足转移条件后,前者是PC+2+rel→PC,而后者是PC+3+rel→PC。例:说明下面一段程序运行后累加器A中的结果。MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$解:根据程序可知,运算结果A=10+9+8+7+6+5+4+3+2+1=55D=37H

温馨提示

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

评论

0/150

提交评论