单片机51系列指令系统与程序设计方法_第1页
单片机51系列指令系统与程序设计方法_第2页
单片机51系列指令系统与程序设计方法_第3页
单片机51系列指令系统与程序设计方法_第4页
单片机51系列指令系统与程序设计方法_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

3.1指令格式和伪指令

3.3指令系统

3.4程序设计方法第3章51系列指令系统与程序设计方法单片机原理与应用

3.2寻址方式2023/2/11一、汇编语言指令格式:[标号:]操作码助记符操作数1,操作数2[;注释]换行表示一条指令结束。例:LOOP:MOVA,#40H

;取参数1.标号:指令的符号地址。2.操作码:指明指令操作功能。3.操作数:指令操作对象。数据、地址、寄存器名及约定符号。4.注释行:说明指令在程序中的作用。操作码和操作数是指令主体。MOV—move传送XCH—exchange交换ANL—andlogic与逻辑运算XRL—exclusiveor异或运算MUL—multiply乘法RR—rotateright右循环SJMP—shortjump短跳转RET—return子程序返回3.1指令格式和伪指令标号:必须以字母和下划线开头,由字母或数字组成。2023/2/12二、伪指令:汇编的控制指令,仅提供汇编信息,不产生指令代码。ORG—起始地址指令(定位伪指令):格式:ORG表达式指明程序和数据块起始地址,表达式是一个绝对或地址偏移值。 指令地址机器码 源程序

ORG2000H 2000H7830 MAIN:MOVR0,#30H 2002HE6 MOVA,@R0…

2023/2/133.

DB—定义字节型常数指令。

格式:[标号:]DBn1,n2,n3,….nn例:DB12H,100,‘A’作用:定义一个字节常数表4.

DW—定义字型常数指令。格式:[标号:]DW

n1,n2,n3,….nn例:

DW1234H,5678H作用:定义一个地址表或字常数表注:3和4这两个都是在程序存储器中存放。2.位地址赋值伪指令格式:符号名BIT位地址作用:将一个位地址赋给一个符号名。ClockBIT90H;定义P1.0为时钟线clock

2023/2/145.赋值伪指令EQU

格式:符号名EQU表达式(寄存器名)将表达式或一个寄存器名赋给一个符号名。

X1 EQU2000H

X2 EQU0FH

MAIN:MOVDPTR,#X1

ADDA,#X2

6.

END—结束汇编伪指令。例:START:……ENDSTART2023/2/15二、机器语言指令格式: 操作码[操作数1][,操作数2] 有单字节、双字节和三字节指令。汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,指令表中可查出对应指令代码。举例: 汇编语言: 机器语言:

MOVA,R0

E8H MOVR6,#32H 7E32H MOV40H,#64H 754064H1110100001111110001100100111010101000000011001002023/2/16三、常用的主要缩写符号

A累加器Acc

AB寄存器对

direct直接地址00H~0FFH#data立即数,表示一个常数

00H~0FFH

@间接寻址标记X寄存器名(X)X寄存器内容((X))由X寄存器寻址的存储器单元内容$本条指令起始地址rel

相对偏移量-128~+127rrr

其值由工作寄存器Rn确定,R0~R7对应000~1112023/2/17寻址方式:寻找本条指令中操作数的有效地址方式。主要的寻址方式有:立即寻址;直接寻址;寄存器寻址;寄存器间接寻址;基寄存器加变址寄存器间接寻址;

还有相对寻址等。

3.2指令寻址方式2023/2/18一、操作数类型:位(bit)─位寻址区中的一位二进制数据字节(Byte)─8位二进制数据字(Word)─16位双字节数据二、寻址方式:1.立即寻址方式:

指令中给出实际操作数据(立即数),一般用于为寄存器或存储器赋常数初值。举例:

8位立即数:MOVA,#40H ;A¬40H16位立即数:MOVDPTR,#2100H;DPTR¬2100H2023/2/192.直接寻址方式:

指令操作数是存储器单元地址,数据放在存储器单元中。

MOVA,40H ;A¬(40H)直接寻址方式对数据操作时,地址是固定值,而地址所指定的单元内容为变量形式。41H

78H40H

56H

例:设存储器两个单元的内容如图所示,执行指令MOVA,40H后A=?思考题:

直接寻址方式指令和立即寻址方式指令的形式有什么不同?56H2023/2/1103.寄存器寻址方式:4.寄存器间接寻址方式:

指令的操作数为寄存器名,寄存器中为数据地址。存放地址的寄存器称为间址寄存器或数据指针。例: MOVA,@R0 ;A¬((R0))

设指令执行前A=20H,R0=40H,地址为40H存储器单元内容如图所示。执行指令后,A=?,R0=?,(40H)=?34H40H34H01000000AR000100000

41H 67H

40H34HR0→A20HR040H例:

MOVA,R0 ;A¬(R0)

设指令执行前A=20H,R0=40H,

执行指令后,A=?,R0=?指令操作数为寄存器名,数据在寄存器中。40H40H2023/2/1115.基寄存器加变址寄存器间接寻址方式:

例:

MOVCA,@A+DPTR ;A¬((A+DPTR))设指令执行前A=09H,DPTR=2000H,存储器单元内容如图所示。执行指令后,A=?DPTR=?12H2000H2008H

89H2009H

12H

数据在存储器中,指令给出的寄存器为数据的基地址(基寄存器PC和DPTR)和偏移量(变址寄存器A)。

数据地址=基地址+偏移量。

说明:1、只对程序存储器;

2、指令形式:MOVCA,@A+DPTR

MOVCA,@A+PC

JMP@A+DPTR2023/2/112指令给出位地址。一位数据在存储器位寻址区。(1)内部RAM中的位寻址区:字节地址为20H~2FH;(2)专用寄存器的可寻址位:11个(83位)表示方法:1)直接使用位地址;如:PSW的位6可表示为0D6H2)位名称表示;或AC3)字节地址加位数表示;或0D0H.64)专用寄存器符号加位数表示。或PSW.6例:

MOVC,40H ;CY(位地址40H)设指令执行前CY=1,位地址40H存储器单元如图,执行指令后,CY=?29H0110001028H11010110位寻址区06.位寻址方式(可归属于直接寻址):2023/2/1137.相对寻址方式:目的地址=转移指令地址+转移指令字节数+rel

(rel为偏移量)

当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:

SJMPrel

操作:跳转到的目的地址=当前16位PC值+rel注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128~+127(80H~7FH)。在实际编程中,“rel”通常用标号代替。2023/2/114

3.3指令系统单片机所能执行的各种指令的集合称为它的指令系统

指令的分类:每条指令在程序存储器ROM中占据一定的空间,以字节为单位。51系列按指令所占字节数分类:

单字节(49条);双字节(46条);3字节(16条)

每条指令在执行时要花去一定的时间,以机器周期为单位。51系列按指令执行时间分类:

单周期(64条);双周期(45条);4周期(2条)按指令的功能分类,可分为5大类:51系列有

数据传送类(29条);算术运算类(24条);逻辑运算及移位类(24);控制转移类(17条);位操作类(17条)2023/2/115

3.3.1数据传送指令 最基本和最重要的指令类,可实现寄存器、存储器之间的数据传送。 一、内部传送指令: 片内数据存储器数据传送。二、外部传送指令: 片外数据存储器数据传送。 三、交换指令: 片内数据存储器数据传送。四、堆栈操作指令: 片内数据存储器数据传送。五、查表指令: 程序存储器数据传送。2023/2/116(一)内部传送指令:习题:找出配对指令,实现反向传送。指令机器码:11101rrr

E8~EF11100101n

E5

n1110011i

E6、E7

01110100d74d

10101rrrn

1010011in85n1n2

90d1d2MOVA,Rn

;A←(Rn),Rn=R0~R7MOVA,direct

;A←(direct)MOVA,@Ri

;A←((Ri)),Ri=R0、R1

MOVA,#data

;A←data

MOVRn,direct

;Rn←(direct) MOV@Ri,direct ;(Ri)←(direct)MOVdirect1,direct2

;(direct1)←(direct2)

MOVDPTR,#d1d2 ;DPTR←d1d2

实现片内数据存储器中数据传送。指令格式:

MOV

目的操作数,源操作数寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间址。2023/2/117例:MOVA,#30H MOV4FH,A MOVR0,#20H MOV@R0,4FH MOV21H,20H习题:用两种寻址方式实现,将片内RAM

60H单元的数据传送给累加器A。解:MOVA,#60H(×)MOVR0,#60H(√)MOVA,@R0;A=30H;(4FH)=30H;R0=20H;(20H)=30H;(21H)=30HMOVR0,60HMOVA,@R0

(×)

解:MOVA,60H

(√)

结果A=32H顺序执行下列指令序列,求每一步执行结果。2023/2/118说明:只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。1.一条指令中不能同时出现两个工作寄存器:

非法指令: MOVR1,R2

MOVR2,@R02.间址寄存器只能使用R0、R1。

非法指令:MOVA,@R23.SFR区只能直接寻址,不能用寄存器间接寻址。

非法指令:MOVR0,#80H

MOVA,@R02023/2/119(二)外部RAM传送指令:(MOVX)

指令格式:MOVX

目的操作数,源操作数寻址方式:片外数据存储器用寄存器间址方式。DPTR作16位数据指针,寻址64KB片外RAM空间:

MOVXA,@DPTR ;A←((DPTR))(读)

MOVX@DPTR,A ;(DPTR)←A(写)2.Ri作8位数据指针,寻址256B片外RAM空间(页内寻址):

MOVX A,@Ri

;A←((P2Ri))

(读) MOVX @Ri,A

;(P2Ri)←A(写)实现片外数据存储器和A累加器之间的数据传送。

2023/2/120例:实现片外数据存储器数据传送(2000H)®(2100H)。

MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A习题:将片外RAM0000H单元的数据传送到片内RAM的60H单元。

;DPTR=2000H ;A=X ;DPTR=2100H ;(2100H)=X片外数据存储器不能直接寻址。下列为非法指令:

MOVXA,2000HMOVX2100H,2000H思考题:为什么对DPTR的数据传送使用内部传送指令?2023/2/121(三)ROM传送指令(查表指令):(MOVC)

1.DPTR为基址寄存器:

MOVC A,@A+DPTR;A¬((A+DPTR))(读) 查表范围为64KB

程序存储器任意空间,称为远程查表指令。2.PC为基址寄存器:

MOVC A,@A+PC ;A¬((A+PC))(读)

常数表只能在查表指令后256B范围内,称为近程查表指令。实现从程序存储器读取数据到A累加器,只能使用变址间接寻址方式。

多用于查常数表程序,可直接求取常数表中的函数值。2023/2/122例1:以查表方法把累加器中的十六进制数转换为ASCII码,并送回累加器中。程序如下:指令地址源程序

ORG2000H2000HBA:INCA2001MOVCA,@A+PC

2002RET2003DB30H2004DB31H2005DB32H……2011DB45H2012DB46H2023/2/123例2:程序:ORG1000H SQU: MOVDPTR,#3000H ;确定表首地址(基地址)

MOVA,20H ;取X(变量:偏移量)MOVCA,@A+DPTR

;查表求Y=X2 MOV21H,A ;保存Y(结果) RET ;子程序结束 … ;其它程序段

ORG3000H;常数表格首地址TAB:DB00,01,04,09,…,225 ;平方表

END方法1:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。2023/2/124指令地址

源程序

ORG1000H ;程序起始地址 1000H SQU: MOVA,20H ;取X 1002H ADDA,#3

;修正偏移量 1004H MOVCA,@A+PC

;查表求Y=X2(PC=1005H)

1005H MOV21H,A

;存结果

1007H RET

;子程序结束

1008H TAB: DB00,01,04… ;平方表

100BH DB09,…,225 方法2:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。例2:2023/2/125(四)交换指令:

1.字节交换指令

XCHA,Rn

;A«(Rn)

XCHA,@Ri

;A«((Ri))

XCHA,direct

;A«(direct)习题:将片内RAM60H单元与61H单元的数据交换。例:设A=29H,执行指令XCHA,2AH后,A=?, (2AH)=?38H29HXCH60H,61H;

←对吗?29H不对!!实现片内RAM区的数据双向传送。2023/2/1262.半字节交换指令:XCHDA,@Ri;A0~3

«((Ri))0~3SWAPA ;A4~7

«A0~3例:将片内RAM2AH和2BH单元中的ASCII码转换成压缩式BCD码存入20H单元。58H习题:交换片内RAM40H单元和41H单元的低半字节。A30H010100000101100050H58HMOVA,#0MOVR0,#2AHMOVR1,#2BHXCHDA,@R0SWAPAXCHDA,@R1XCHA,20H0011000005H0000000000H0000010120HR1A0101100058H30H00110000R0AA35H00110101R138H00111000R02023/2/127(五)堆栈操作指令:

例:设

A=02H,B=56H,执行下列指令后,SP=?,A=?,B=?SBR:MOVSP,#30H;设栈底PUSHA PUSHB MOVA,#00H MOV B,#01H … POP B POPASP→××

××

×SP→B02H××

×02H

×56HASP→B02H××

56H02H

×56HASP→B00H××

56H02H

×01HASP→B00H××

56H02H

×56HASP→B02H××

56H02H

×56HA02H56H30HB02H56HA入栈指令:PUSHdirect;SP←SP+1,(SP)←(direct)出栈指令:POPdirect;(direct)←(SP),SP←SP-1

“先加后压”

“先弹后减”2023/2/128练习:

说明程序执行过程中,SP的内容及堆栈中内容的改变过程。

程序如下:

MOVSP,#30HMOVA,#20HMOVB,#30HPUSHAPUSHB……POPAPOPB;SP=30H;A=20H;B=30H;SP=31H(31H)=20H;SP=32H(32H)=30H……;A=30HSP=31H;B=20HSP=30H2023/2/129习题:找出指令错误并改正:1.MOVA,#1000H;A←1000H(A装1个字节数)2.MOVXA,1000H;A←(1000H)片外RAM(DPTR、Ri)3.MOVCA,1000H;A←(1000H)片外ROM(DPTR、PC)4.MOVX60H,A ;片外RAM(60H)←A(应为MOV)5.MOVR0,60H;片内RAM:(61H)←(60H) MOV61H,@R0

(片内RAM可直接寻址)

6.XCHR1,R2 ;R1«R2(必须有A参加)7.MOVXDPTR,#2000H;DPTR←2000H(应为MOV)8.MOVX60H,@DPTR ;片内RAM←片外RAM(必须有A参加)2023/2/1303.3.2 算术运算指令与数据传送指令不同,多数算术运算指令会影响标志位的状态,即CPU执行算术运算指令后,根据数据操作情况自动设置标志位的状态。

MCS-51的程序状态字寄存器PSW

为标志寄存器。其格式如下:字节地址为D0H位序B7B6B5B4B3B2B1B0位符号CYACF0RS1RS0OVF1P2023/2/1311.标志位(自动设置状态):1)CY:进位标志位(B7) 保存运算后最高位的进位/借位状态,当有进位/借位,CY=1,否则Cy=0。2)AC:辅助进位标志位(B6) 保存低半字节的进位/借位状态,当D3产生进位/借位,AC=1,否则AC=0。用于十进制调整。3)OV:溢出标志位(B2)

OV=Cy7ÅCy6,补码运算产生溢出OV=1,否则OV=0。4)P:奇偶标志位(B0) 反映累加器A中数据的奇偶性。当1的个数为奇数,P=1,否则P=0。2023/2/1322.用户选择位(编程设置状态)1)F0、F1:用户自定义标志位。

2)RS1、RS0

工作寄存器区选择位。

复位时,PSW=00H例:复位后,设置使用工作寄存器3区,其余标志位不变。解:MOVPSW,#18HRS1RS0工作寄存器000区011区102区113区位序B7B6B5B4B3B2B1B0位符号CYACF0RS1RS0OVF1P2023/2/133算术运算指令: 加减指令(读-修改-写): 1.加法指令:

00111011=3BH

+00111011=3BH

0111011076H0011 1)不带进位加法:ADDA,源操作数如:ADDA,R2;A←A+R2,影响CY、OV、AC、P

例1:已知A=3BH,PSW=0,执行指令

ADDA,#3BH后求:A=?Cy=?OV=?AC=?P=? PSW=?01000001=41H完成片内RAM和A中数据的加减乘除运算。位序B7B6B5B4B3B2B1B0位符号CYACF0RS1RS0OVF1P2023/2/134

10011010=9AH

11100011=E3H+

0

1

01111101=7DH

2)带进位加法:

ADDCA,源操作数

如:ADDCA,R2

;A←A+R2+Cy,影响Cy、OV、AC、P7DH1100

例:A=9AH,R2=E3H,PSW=0,执行指令

ADDCA,R2

后求:

A=?Cy=?OV=?AC=?P=? PSW=?10000100=84H位序B7B6B5B4B3B2B1B0位符号CYACF0RS1RS0OVF1P2023/2/135带进位加法指令ADDC用于多字节运算:例:设双字节数X存在片内RAM41H、40H单元,Y存在42H、43H单元,编程求Z=X+Y,并存入片内RAM单元44H、45H、46H。MOVA,40HADDA,42HMOV44H,AMOVA,41HADDCA,43HMOV45H,AMOVA,#00HADDCA,#00HMOV46H,ARET;取被加数低字节;加上加数低字节;保存和的低字节;取被加数高字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束;低字节相加;高字节相加;计算高字节进位;子程序结束2023/2/136十进制加法指令:仅对加法结果进行调整

ADDA,源操作数 DAA带进位十进制加1法指令:

ADDCA,源操作数 DAA作业:BCD码加法编程。 设X、Y为4位压缩BCD码,求Z=X+Y。BCD调整指令:BCD:Binary-Coded-Decimal(二进制编码的十进制)DAA ;把A中按二进制相加后的结果调整成按BCD数相加的结果调整原因:1、相加结果大于9,进入无效编码区;2、相加结果有进位,跳过无效编码区。调整方法:进行加“6”修正。2023/2/1372.减法指令:

如:SUBBA,R2

;A←A-R2-Cy, ;影响Cy、OV、AC、P000000习题:编程求双字节减法。设X、Y存在片内RAM60H起始单元,计算

Z=X-Y。例:A=5AH,R2=5AH,Cy=0,执行下列指令

SUBBA,R2求: A=?Cy=?OV=?P=?AC=?思考:有不带借位的减法指令吗?

01011010=5AH

0101

1010=5AH

-

0

00000000=00HSUBBA,源操作数;带借位减法指令2023/2/1383.增量、减量指令:

INC单操作数

如: INCR2

;R2←R2+1DEC单操作数

如:DECR2

;R2←R2-1

INCDPTR

;DPTR←DPTR+1 不影响标志位状态。注意:没有指令DECDPTR

可用指令DECDPL代替2023/2/1394.乘除指令:

MULAB

;BA←A×B,Cy←0, ;当积高字节B=0,OV←0;B≠0,则OV←1例:A=96(60H),B=192(C0H),执行指令MULAB后,

求:A=?B=?Cy=?OV=?P=?解:

96×192=18432(4800H)00H48H01012H0CH000例:A=156(F6H),B=13(0DH),执行指令DIVAB后求:A=?B=?Cy=?OV=?P=?解:

156÷13=18(12H),余数=12(0CH)。思考题:如何实现多字节数据的乘除运算。

DIVAB

;A÷B,A←商,B←余数,Cy←0, ;当除数B=0,OV←1;B≠0,则OV←02023/2/1403.3.3

逻辑运算指令一、单操作数指令(A累加器为操作数):

1.A清0指令:

CLRA;A←0

2.A取反指令:CPLA;A←A

3、循环移位指令:1)8位循环指令:

RLA

;A循环左移一位rotate

RRA

;A循环右移一位2)9位循环指令:

RLCA;带Cy循环左移一位

RRCA;带Cy循环右移一位2023/2/141例:设A=11000101B,Cy=0,分别执行下列单条指令:

CPLA

求:A=?Cy=?

RLA求:A=?Cy=?

RLCA

求:A=?Cy=?

001110100100010110100010101CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A0CyR6R5Cy;Cy=0,设R6=55H,R5=AAH;R6=01010101B,R5=10101010B,Cy=0;R6=01010101B,R5=01010100B,Cy=1;R6=10101011B,R5=01010100B,Cy=0思考题:如何将寄存器R6R5中的双字节数X右移一位。用9位循环指令实现多字节移位:

例:编程将寄存器R6R5中的双字节数X左移一位。2023/2/142二、双操作数逻辑运算指令(对位逻辑运算):

ANL、ORL、XRL习题1:如何将累加器A中的数据高4位清0,低位不变?

习题2:如何将寄存器R2中的数据奇数位取反,偶数位不变?例:A=01××××××B,×表示随机状态,为1或0,下述一组指令执行后,A的值如何?

XRLA,#0C0H

;将累加器A的内容D7、D6取反

ORLA,#03H ;将累加器A的内容D1、D0置1

ANLA,#0E7H

;将累加器A的内容D4、D3清0

解:执行上述指令后,A=10×00×11B。2023/2/1433.3.4布尔变量操作指令一.位传送:

MOVC,bit;Cy¬(bit)

MOVbit,C;(bit)¬Cy例:将位地址20H的一位数传送到位地址30H中:

MOVC,20H MOV30H,C二.位清0、置1、取反(CLR、SETB、CPL): CLRC ;Cy¬0 CLR40H ;(位地址40H)¬0对片内RAM中位寻址区操作。位累加器Cy和位地址bit。2023/2/144三.逻辑运算(ANL、ORL):例:设Cy=1,(位地址40H)=1,执行指令

ANLC,40H后,

Cy=?,(位地址40H)=?位地址表示法:

位地址40H,位寄存器F0

,字节加位ACC.00习题:设累加器A中数据为29H=00101001B,Cy=0,执行指令 ORLC,0E3H后,Cy=?11ANLC,40H;C←C∧(40H)ANLC,40H;C←C∧(40H)2023/2/145

3.3.5

转移指令

按转移条件分类:1)无条件转移:(LJMP、AJMP、SJMP、JMP)执行无条件转移指令,程序无条件转移到指定处。2)条件转移:

指令中给出转移条件,执行指令时,先测试条件:若满足条件,则程序发生转移;否则,仍顺序执行程序。转移指令通过改写PC的当前值,从而改变CPU执行程序的顺序,使程序发生跳转。2023/2/146按转移方式分类:1)绝对转移:指令给出转移目的的绝对地址d2d1,执行指令后,PC¬d2d1。2)相对转移:指令给出转移目的与转移指令的相对偏移量rel,执行指令后,PC¬PC

+rel。

目的地址=PC+字节数+rel例:

地址 源程序

1000H

LJMP2000H(长转移)

1003H … …

2000H

;转移目的指令

例:

地址 源程序

1000H

SJMP02(短转移)(2字节)

… 1004H …;转移目的指令2023/2/147一、无条件转移指令:无条件转移:LJMP,AJMP,SJMP,JMP——4条LJMPaddr16长跳转指令

——可在64KB范围内跳转AJMPaddr11短跳转指令

——可在指令所在的2KB范围内跳转SJMPrel

相对跳转指令

——可在当前PC-128与+127范围内跳转JMP@A+DPTR散转指令

——可在以DPTR为基址+A为偏移量之和所指向的64KB程序范围内跳转2023/2/148

2.短跳转指令:

AJMP

addr11

;PC¬PC+2(2个字节) ;PC10~0¬addr11 PC15~11不变

指令机器码:addr11~900001addr8~1指令转移范围:2KB转移时要求转移前后保持PC15~11不变。

例:1030HAJMP100H

指令机器码:2100H

目的地址为:1100H

1.长转移指令:

LJMP addr16(d2d1)

;PC¬d2d1

指令机器码:

02d2d1

指令转移范围:64KB2023/2/149相对偏移量rel

的计算通式:

rel=[目的地址-(转移指令地址+指令字节数)]补 =[目的地址-

PC当前值]补(1)由偏移量rel计算目的地址;(2)由目的地址计算偏移量rel。

3.相对跳转指令:

SJMPrel

;PC¬PC+2,PC¬PC+rel指令机器码:80Hrel

相对偏移量rel为带符号的8位补码数。

rel=[目的地址-(源地址+2)]补

rel为正数:向前转移;rel=地址差-2

rel为负数:向后转移。rel=FEH+地址差指令转移范围:前128~后127字节编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。

LJMPNEXT(AJMPNEXT/SJMPNEXT)

NEXT:2023/2/150例2:计算转移指令的相对偏移量rel,并判断是否超出转移范围?相对偏移量rel

=2150H-(2130H+2)=001EH=+30D(未超出转移范围),

rel=1EH求出指令机器码:801EH

指令地址 源程序2130H SJMPNEXT …2150HNEXT:MOVA,R2例1:计算转移指令的目的地址。

(1)835AHSJMP35H解:rel=35H=00110101B为正数,因此程序向前转移。目的地址=(PC)+2+rel=835AH+02H+35H=8391H

(2)835AHSJMP0E7H解:rel=0E7H=11100111B为负数,因此程序向后转移。目的地址=835AH+02H+0E7H=8343H2023/2/151例3:求原地踏步指令的指令代码:

HERE:SJMPHERE(或SJMP$)相对偏移量=[2000H-(2000H+2)]补=FEH,

rel=FEH求出指令代码为:80FEH习题:计算程序中转移指令的相对偏移量rel,并判断是否超出转移范围。

地址 源程序

2130H LOOP:…

21B0H SJMPLOOP

相对偏移量=[2130H–(21B0H+2)]补=(-130)补

rel已超出转移范围(-126D~+129D)2023/2/152KEY: MOVDPTR,#KTABMOVA,40HADDA,A

JMP@A+DPTRKTAB: AJMPFUNC0

AJMPFUNC1 …FUNC0:… FUNC1:…

应用:处理功能键。要求不同功能键执行不同程序段。设每个功能键对应一个键值X(0≤X≤FH)。

设X已存入片内RAM的40H单元中。若X=0,则执行程序段FUNC0;若X=1,则执行程序段FUNC1;

4.间接转移指令(多分支转移指令):

JMP@A+DPTR

;PC←((A+DPTR))

指令机器码73H,指令转移范围64KB。2023/2/153二、条件转移指令:A判零转移指令:

JZrel

;PC←PC+2,

;若A=00H,PC←PC+rel(转移),

若A≠00H,PC不变(不转移)条件转移指令形成程序的分支,赋予计算机判断决策能力。

转移条件:1)标志位的状态;2)位地址中的状态。JNZrel

;PC←PC+2, ;若A≠00HPC←PC+rel(转移)若A=00H,PC不变(不转移)2.判Cy转移指令:

JCrel

;Cy=1则转移,Cy=0不转移

JNCrel

;Cy=0则转移,Cy=1不转移2023/2/1543.判位转移指令:

JBbit,rel

;(bit)=1转移,否则不转移

JNBbit,rel

;(bit)=0转移,否则不转移4.判位清0转移指令:

JBCbit,rel

;(bit)=1转移,且(bit)=0,否则不转移5.比较不相等转移指令:

CJNE操作数1,操作数2,rel

CJNEA,direct,rel

;PC←PC+3

;若A=(direct),顺序执行,且Cy=0。

若A≠(direct),则PC←PC+rel+3 且当A>(direct),Cy=0,当A<(direct),Cy=1。

相当于两个操作数相减,仅影响标志状态,不保存结果。2023/2/155

6.循环转移指令:

DJNZ操作数,rel

DJNZR2,rel;PC←PC+2,R2←R2-1 ;若R2≠0,PC←(PC)+2+rel, ;若R2=0,PC←(PC)+2。

例:用于循环结构程序。设要求程序循环执行100次。

MOVR2,#100 ;设循环计数器初值LOOP: … ;多次循环程序段

DJNZR2,LOOP ;循环控制

;循环结束

习题:当循环计数器初值为0,循环次数有多少?

例:设单片机的晶振频率为6MHz,编写一段延时程序约100ms的子程序。

Delay:MOVR7,#64H ;设循环计数器初值(100次)LOOP: MOVR6,#0FAH;循环250次(250×4=1ms)

DJNZR6,$

;循环控制

DJNZR7,LOOP

RET

T=12/6MHz=2μs

t=2μs+100×(2μs+1ms+2×2μs)+2×2μs=100.606ms

初始化循环体控制变量的修改循环次数的控制

包括2023/2/1563.3.6

子程序调用和返回指令

子程序调用和返回指令也使程序发生转移。一、长调用指令:

LCALLaddr16

;PC¬PC+3, ;SP¬SP+1,(SP)¬PC0~7;SP¬SP+1,(SP)¬PC8~15;P

温馨提示

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

评论

0/150

提交评论