null第3章 MCS-51系列单片机的
指令系统第3章 MCS-51系列单片机的
指令系统3.1 指令系统简介
3.2 寻址方式
3.3 数据传送类指令
3.4 算术运算类指令
3.5 逻辑运算及移位类指令
3.6 控制转移类指令
3.7 位操作类指令3.1 指令系统概述3.1 指令系统概述 指令是规定计算机进行某种操作的命令。一台计算机所能执行的指令集合称为该计算机的指令系统。
3.1.1 指令概述
计算机内部只识别二进制数。因此,能被计算机直接识别、执行的指令是使用二进制编码表示的指令,这种指令被称为机器语言指令。
MCS-51系列单片机指令系统共有111条指令,按功能划分,可分为五大类:
1)数据传送类指令(29条);
2)算术运算类指令(24条);
3)逻辑运算及移位类指令(24条);
4)控制转移类指令(17条);
5)位操作类指令(17)。null3.1.2 指令格式
一条完整的指令格式如下:
[标号:] 〈操作码〉 [操作数] [;注释]
标号—标号是该指令的起始地址,是一种符号地址。
标号可以由1~8个字符组成,第一个字符必须是字母,其余字符可以是字母、数字或其他特定符号。标号后跟分界符“:”。
操作码—指令的助记符。它规定了指令所能完成的操作功能。
操作数—指出了指令的操作对象。操作数可以是一个具体的数据,也可以是存放数据的单元地址,还可以是符号常量或符号地址等。
多个操作数之间用逗号“,”分隔。
注释—为了方便阅读而添加的解释说明性的文字, 用“;”开头。null3.1.3 指令中常用符号说明
Rn —当前选中的工作寄存器组中的寄存器R0~R7之一, 所以n=0~7。
Ri —当前选中的工作寄存器组中可作地址指针的寄存器R0、R1,所以i=0、1。
#data —8位立即数。
#data16 —16位立即数。
direct —内部RAM的8位地址。即可以是内部RAM的低128个单元地址,也可以是特殊功能寄存器的单元地址或符号。在指令中direct表示直接寻址方式。
addr11 ——11位目的地址,只限于在ACALL和AJMP 指令中使用。
addr16 —16位目的地址,只限于在LCALL和LJMP 指令中使用。null re l—补码形式表示的8位地址偏移量,在相对转移指令中使用。
bit —表示片内RAM位寻址区或可位寻址的特殊功能寄存器的位地址;
@ —间接寻址方式中间址寄存器的前缀标志;
C —进位标志位,它是布尔处理机的累加器,也称之为位累加器;
/ —加在位地址的前面,表示对该位先求反再参与操作,但不影响该位的值;
(x)—由x指定的寄存器或地址单元中的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
;
((x))—由x所指寄存器的内容作为地址的存储单元的内容;
$ —表示本条指令的起始地址;
← —表示指令操作
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
,将箭头右边的内容送到箭头左边的单元中。3.2 寻址方式3.2 寻址方式寻址就是寻找操作数的地址,寻址方式则指出寻找操作数地址的方式方法。
MCS-51系列单片机提供了七种寻址方式。
3.2.1 立即寻址
所谓立即寻址就是在指令中直接给出操作数。通常把出现在指令中的操作数称为立即数。为了与直接寻址指令中的直接地址相区别,在立即数前面加“#”标志。例如:
MOV A,#3AH
其中3AH就是立即数,该指令功能是将3AH这个数本身送入累加器A中。null3.2.2 直接寻址
在指令中直接给出操作数地址,这就是直接寻址方式。例如:
MOV A,3AH
其中3AH就是表示直接地址,
其操作示意图如图3-1所示,
直接寻址方式可访问以下
存储空间:
①内部RAM低128个字节单元。
②特殊功能寄存器。
应注意:直接寻址是访问特殊功能
寄存器的唯一方法。null3.2.3 寄存器寻址
寄存器寻址即寄存器的内容就是操作数。因此在指令的操作数位置上指定了寄存器就能得到操作数。MOV A,R0
MOV R2,A
前一条指令是将R0寄存器的内容送到累加器A中。
后一条是把累加器A中的内容传送到R2寄存器中。
采用寄存器寻址方式的指令都是一字节的指令,可以作寄存器寻址的寄存器有:R0~R7、A、AB寄存器对和数据指针DPTRnull3.2.4 寄存器间接寻址
所谓寄存器间接寻址就是以寄存器中的内容作为RAM地址,该地址中的内容才是操作数。
寄存器前加“@”标志,表示间接寻址。
例如:MOV A,@R0
其操作示意图如图3-2所示。
此时R0寄存器的内容3AH
是操作数地址,内部RAM的
3AH单元的内容65H才是操
作数,把该操作数传送到
累加器A中,结果A=65H。 能用于间接寻址的寄存器有R0,R1,DPTR,SP。其中R0、R1必须是工作寄存器组中的寄存器。SP仅用于堆栈操作。
间接寻址可以访问的存储器空间包括内部RAM和外部RAM。
①内部RAM的低128个单元采用R0、R1作为间址寄存器
②外部RAM:一是采用R0、R1作为间址寄存器,可寻址256个单元。二是采用16位的DPTR作为间址寄存器,可寻址外部RAM的整个64KB地址空间。
能用于间接寻址的寄存器有R0,R1,DPTR,SP。其中R0、R1必须是工作寄存器组中的寄存器。SP仅用于堆栈操作。
间接寻址可以访问的存储器空间包括内部RAM和外部RAM。
①内部RAM的低128个单元采用R0、R1作为间址寄存器
②外部RAM:一是采用R0、R1作为间址寄存器,可寻址256个单元。二是采用16位的DPTR作为间址寄存器,可寻址外部RAM的整个64KB地址空间。
例如: MOV @R0,A ;内部RAM(R0)←A
(a) (b)
MOVX @DPTR,A;外部RAM(DPTR)←A
其指令操作过程示意图如上图(b)所示。例如: MOV @R0,A ;内部RAM(R0)←A
(a) (b)
MOVX @DPTR,A;外部RAM(DPTR)←A
其指令操作过程示意图如上图(b)所示。 其指令操作过程示意图如下图(a)所示。null对于52子系列的单片机,其内部RAM是256个字节,其高128字节地址与特殊功能寄存器的地址是重叠的,在使用上,对52子系列的高128B RAM,必须采用寄存器间接寻址方式访问,对特殊功能寄存器则必须采用直接寻址方式访问。
3.2.5 变址寻址
变址寻址是以DPTR或PC作基址寄存器,以累加器A作变址寄存器,并以二者内容相加形成的16位地址作为操作数地址(ROM中地址)。
例如:
MOVC A,@A+DPTR ;A ←((A)+DPTR))
MOVC A,@A+PC ;A ←((A)+(PC))null
第一条指令的功能
将A的内容与DPTR的
内容之和作为操作数
地址,把该地址中的
内容送入累加器A中,
如图3-3所示。
第二条指令的功能
将A的内容与PC的内
容之和作为操作数地
址,把该地址中的内
容送入累加器A中。
这两条指令常用于访问程序存储器中的数据
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
。且都为一字节指令。null3.2.6 相对寻址
相对寻址即将程序计数器PC的当前值与指令中给出的偏移量rel相加,其结果作为转移地址送入PC中。相对寻址能修改PC的值,故可用来实现程序的分支转移。
PC当前值是指正在执行指令
的下一条指令的地址。
rel是一个带符号的8位二进
制数,取值范围-128~+127。
2000H:SJMP 54H
这是无条件相对转移指令,
双字节指令,指令代码80H、
54H;其中54H是偏移量。null3.2.7 位寻址
在指令的操作数位置上直接给出位地址,这种寻址方式称为位寻址。 MCS-51系列单片机的特色之一是具有位处理功能,可对寻址的位单独进行各种操作。
例如:MOV C,30H
该指令的功能是把位地址30H中的值(0或1)传送到位累加器CY中。
51系列单片机的内部RAM有两个区域可以位寻址:一个是位寻址区20H~2FH单元的128位,另一个是字节地址能被8整除的特殊功能寄存器的相应位。null在MCS-51系列单片机中,位地址有以下几种表示方式:
(1)直接使用位地址。对于20H~2FH共16个单元的128位,其位地址编号是00H~7FH,例如,20H单元的0~7位的位地址为00H~7H。
(2)用单元地址加位序号表示。如25H.5表示25H单元的D5位(位地址是2DH),而PSW中的D3可表示为D0H.3。这种表示方法可以避免查表或计算,比较方便。
(3)用位名称表示。特殊功能寄存器中的可寻址位均有位名称,可以用位名称来表示该位。如可用RS0表示PSW中的D3位:D0H.3
(4)对特殊功能寄存器可直接用寄存器符号加位序号表示。如PSW中的D3位,又可表示为PSW.3。3.3 数据传送类指令3.3 数据传送类指令数据传送类指令的功能是把源操作数传送到目的操作数,源操作数不变,目的操作数被源操作数所代替。
3.3.1 内部RAM数据传送指令
内部RAM的数据传送类指令是指累加器、寄存器、特殊功能寄存器、RAM单元之间的数据相互传送。
1.以累加器A为目的操作数的数据传送指令
MOV A,#data ;A ←data
MOV A,direct ;A ←(direct)
MOV A,Rn ;A ←(Rn)
MOV A,@Ri ;A ← ((Ri))
这组指令的功能是将源操作数所指定的内容送入累加器A中。null2.以寄存器Rn为目的操作数的数据传送指令
MOV Rn,A ;Rn ←(A)
MOV Rn,#data ;Rn ←data
MOV Rn,direct ;Rn ←(direct)
这组指令的功能是将源操作数所指定的内容送到当前工作寄存器组R0~R7中的某个寄存器中。
注意:没有“MOV Rn,Rn”指令,
也没有“MOV Rn,@ Ri”指令。
例3-1 (A)=50H,(R1)=10H,(R2)=20H,
(R3)=30H,(30H)=4FH,执行下述指令:
MOV R1,A ;R1 ← (A)
MOV R2,30H ;R2 ←(30H)
MOV R3,#85H ;R3 ←85H
执行后:(R1)=50H,(R2)=4FH,(R3)=85H。null3.以直接地址为目的操作数的数据传送指令
MOV direct,A ;direct ← (A)
MOV direct,#data ;direct ←data
MOV direct1,direct2 ;direct1 ←(direct2)
MOV direct,Rn ;direct ←(Rn)
MOV direct,@Ri ;direct ←((Ri))
这组指令的功能是将源操作数所指定的内容送入由直接地址direct所指定的片内存储单元。
例3-2 已知:(R0)=60H,(60H)=72H,
MOV 40H,@R0 ;(40H)←(60H)
指令执行过程如图3-5所示。
执行结果为:
(40H)=72Hnull4.以间接地址@Ri为目的操作数的数据传送指令
MOV @Ri ,A ;(Ri) ←(A)
MOV @Ri ,#data ;(Ri) ←data
MOV @Ri , direct ;(Ri) ←(direct)
这组指令的功能是把源操作数所指定的内容送入以R0或R1为地址指针的片内RAM单元中。源操作数可采用寄存器寻址、立即寻址和直接寻址3种方式。
注意:没有“MOV @Ri ,Rn”指令。
例3-3 已知:(R1)=30H,(A)=20H,执行指令:
MOV @R1 ,A ;(30H)←(A)
执行结果为:(30H)=20H。null5.以DPTR为目的操作数的数据传送指令
MOV DPTR ,#data16 ;DPTR ←data16
这是MCS-51系列单片机指令系统中唯一的一条16位立即数传送指令,其功能是将外部存储器(RAM或ROM)某单元地址作为立即数送到DPTR中,立即数的高8位送DPH,低8位送DPL。
在学习、使用上述各条指令时,需注意以下几点:
(1)要区分各种寻址方式的含义,正确传送数据。
(2)所有传送指令都不影响标志位。这里所说的标志位是指CY、AC、和OV。涉及到累加器A的将影响奇偶标志位P。null(3)估算指令的字节数:凡是指令中既不包含直接地址、又不包含8位立即数的指令均为一字节指令;若指令中包含一个直接地址或8位立即数,则指令字节数为2,若包含两个这样的操作数,则指令字节数为3。
例3-4 若(R0)=30H,(30H)=50H,执行指令:
MOV A,R0 ;(A)=30H (一字节)
MOV A,30H ;(A )=50 H (二字节)
MOV A,#30H ;(A )=30H (二字节)
MOV 30H ,#0FH ;(30H )=0FH (三字节)
MOV DPTR,#2000H ;(DPH) =20H ,
(DPL)=00H (三字节) null3.3.2 访问外部RAM的数据传送指令
CPU与外部RAM或I/O口进行数据传送,必须采用寄存器间接寻址的方式,并通过累加器A来传送。这类指令共有四条:
MOVX A ,@DPTR ;A←((DPTR))
MOVX @DPTR ,A ;(DPTR)←A
MOVX A ,@Ri ;A←((Ri))
MOVX @Ri ,A ;(Ri)←A
前两条指令是以DPTR作为间址寄存器, DPTR是16位地址指针,因此其寻址范围可达片外RAM 64KB空间。
后两条指令是以R0或R1作为间址寄存器,R0或R1是8位地址指针,因此其寻址范围仅限于外部RAM 256个字节单元。
该组指令的功能:在DPTR或R0、R1所指定的外部RAM单元与累加器A之间传送数据。null例3-5 试编程,将片外RAM的2000H单元内容送入片外RAM的0200H单元中;
解:片外RAM与片外RAM之间不能直接传送数据,需通过累加器A传送,另外,当片外RAM地址值大于FFH时,需用DPTR作为间址寄存器。编程如下:
MOV DPTR ,#2000H ;源数据地址送DPTR
MOVX A ,@DPTR ;从外部RAM中取数送A
MOV DPTR ,#0200H ;目的地址送DPTR
MOVX @DPTR ,A ;A中内容送外部RAM null3.3.3 程序存储器向累加器A传送数据指令
MOVC A, @A+DPTR ;A←((A)+(DPTR))
MOVC A, @A+PC ;A←((A)+(PC))
两条指令适合于查阅在ROM中建立的数据表格,也称作查表指令,实现的功能完全相同,但使用中有一点差异。
第一条指令采用DPTR作为基址寄存器。使用前可将16位地址送入DPTR中,实现在64KBROM空间向累加器A的数据传送。数据表格可存放在64KBROM的任意位置,因此这条指令称为远程查表指令。
第二条指令是以PC作为基址寄存器。程序中PC值是确定的,为下一条指令的地址,不是表格首地址,使基址与实际要读取的数据表格首地址不一致,这样A+PC与实际要访问的单元地址就不一致,因此,使用该指令之前要用一条加法指令进行地址调整。null由于PC的内容不能随意改变,所以只能借助于A来进行调整,即通过对累加器A加一个数,使得A+PC和所读ROM单元地址一样。
例3-6 若在外部ROM中2000H单元存放(0~9)的平方 值0,1,4,9……,81,要求根据累加器A中的值(0~9)来查找所对应的平方值,并存入60H单元中。
解: ① 用DPTR作基址寄存器:
MOV DPTR,#2000H ;表格首地址送DPTR
MOVC A,@A+DPTR ;根据表格首地址及A中值确定地 址,取数送A。
MOV 60H ,A ;存结果
此处(A)+(DPTR)之和为所查平方值所存地址。 null② 用PC作为基址寄存器:
在MOVC指令之前先用一条加法指令进行地址调整:
ADD A ,# data ;(A)+data 作地址调整
MOVC A ,@A+PC ;(A)+data+(PC)确定查表地址,取数送A。
MOV 60H ,A ;存结果
RET
2000H:DB 0,1,4,9,16,25,36,…,81
执行MOVC指令时,PC已指向下一条指令地址,很显然,PC的内容不是要查找的表格首地址2000H,二者之间存在地址差,这个地址差就是MOVC下边的指令与数据表格首地址之间,其他指令所占的字节数之和。在本例中,地址差是03,即data=03H。null3.3.4 数据交换指令
数据交换指令共有五条,可完成累加器和内部RAM单元之间的整字节或半字节交换。
1.整字节交换指令
整字节交换指令有三条,完成累加器A与内部RAM单元内容的整字节交换。
XCH A,Rn ;( A) ←→(Rn)
XCH A,direct ;(A)←→(direct)
XCH A,@Ri ;(A)←→((Ri))
2.半字节交换指令
XCHD A,@Ri ;(A)3~0←→((Ri))3~0
低半字节交换,高半字节不变。
3.累加器高低半字节交换指令
SWAP A ;(A)7~4←→(A)3~0null例3-7 试编程,将外部RAM 1000H单元中的数据与内部RAM 6AH单元中的数据相互交换。
解:数据交换指令只能完成累加器A和内部RAM单元之间的数据交换,要完成外部RAM与内部RAM之间的数据交换,需先把外部RAM中的数据取到A中,交换后再送回到外部RAM中。编程如下。
MOV DPTR ,#1000H ;外部RAM地址送DPTR MOVX A ,@DPTR ;从外部RAM中取数送A
XCH A ,6AH ;A与6AH地址中的内容交换
MOVX @DPTR ,A ;交换结果送外部RAMnull3.3.5 堆栈操作指令
所谓堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。数据的进栈出栈由指针SP统一管理。可实现对数据或断点地址的保护,堆栈的操作有如下两条专用指令:
PUSH direct ;SP ←(SP)+1,(SP)←(direct)
POP direct ;direct ←((SP)),SP ←(SP)-1
前一条指令是进栈指令,其功能是先将栈指针SP的内容加1,使它指向栈顶空单元,然后将直接地址direct单元的内容送入栈顶空单元。
后一条指令是出栈指令,其功能是将SP所指的单元内容送入直接地址所指出的单元中,然后将栈指针SP的内容减1,使之指向新的栈顶单元。
注意:进栈、出栈指令只能以直接寻址方式来取得操作数,不能用累加器或工作寄存器Rn作为操作数。3.4 算术运算类指令3.4 算术运算类指令算术运算类指令可以完成加、减、乘、除等各种操作,全部指令都是8位数运算指令。如果需要作16位数的运算则需编写相应的程序来实现。
算术运算类指令大多数要影响到程序状态字寄存器PSW中的溢出标志OV、进位(借位)标志CY、辅助进位标志AC和奇偶标志位P。
3.4.1 加法指令
ADD A ,# data ;A ←(A)+data
ADD A ,direct ;A ←(A)+(direct)
ADD A ,Rn ;A ←(A)+(Rn)
ADD A ,@Ri ;A ←(A)+((Ri)) null这组指令的功能是把源操作数所指出的内容与累加器A的内容相加,其结果存放在A中。
该组指令对PSW中各标志位的影响情况如下:
进位标志CY:如D7位向上有进位,则CY=1;
否则CY=0。
半进位标志AC:如D3位向上有进位,AC=1;
否则AC=0。
溢出标志OV:若D7、D6位只有一个向上有进位,OV=1;若D7、D6同时有进位或同时无进位时,OV=0。
奇偶标志P:当A中“1”的个数为奇数时,P=1;为偶数时,P=0。null例3-8 设A=94H,(30H)=8DH,
执行指令 ADD A,30H,操作如下:
1 0 0 1 0 1 0 0
+ )1 0 0 0 1 1 0 1
1 0 0 1 0 0 0 0 1
结果(A)=21H ;(CY)=1; (AC)=1 ;(OV)=1;(P)=0
参加运算的两个数,可以是无符号数(0~255),也可以是有符号数(-128~+127)。
上例中,若把94H、8DH看作无符号数相加,结果中CY=1,表示运算结果发生了溢出(结果超出了8位),此时溢出的含义是向高位产生进位,所以确定结果时不能只看累加器A的内容,而应该把CY的值加到高位上,才可得到正确的结果。即结果为121H;若把94H、8DH看作有符号数(补码表示的),结果中OV=1,它表示运算结果发生了溢出,A中的值是个错误的结果。null3.4.2 带进位加法指令
ADDC A ,# data ;A ←(A)+ data +(CY)
ADDC A ,direct ;A ←(A)+(direct)+(CY)
ADDC A ,Rn ;A ←(A)+(Rn)+(CY) ADDC A ,@Ri ;A ←(A)+((Ri))+(CY)
这组指令的功能是把源操作数所指出的内容与累加器A的内容相加、再加上进位标志CY的值,其结果存放在A中。
运算结果对PSW标志位的影响与ADD指令相同。
需要说明的是,这里所加的进位标志CY的值是在该指令执行之前已经存在的进位标志值,而不是执行该指令过程中产生的进位标志值。 null例3-9 设(A)=AEH,(R1)=81H,(CY)=1。
执行指令 ADDC A,R1,则操作如下:
1 0 1 0 1 1 1 0
1 0 0 0 0 0 0 1
+) 1 ←(CY)
1 0 0 1 1 0 0 0 0
结果(A)=30H,(CY)=1,(OV)=1,
(AC)=1,(P)=0
带进位加法指令主要用于多字节数的加法运算。因低位字节相加时可能产生进位,而在进行高位字节相加时,要考虑低位字节向高位字节的进位,因此,在进行高位字节相加时必须使用带进位的加法指令。null例3-10 设有两个无符号16位二进制数,分别存放在30H、31H单元和40H、41H单元中(低8位先存),写出两个16位数的加法程序,将和存入50H、51H单元。(设和不超过16位)
解: 由于不存在16位数的加法指令,所以只能先加低8位,后加高8位,而在加高8位时要连低8位相加的进位一起相加,编程如下:
MOV A ,30H ;取一个加数的低字节送A中
ADD A ,40H ;两个低字节数相加
MOV 50H ,A ;结果送50H单元
MOV A ,31H ;取一个加数的高字节送A中
ADDC A ,41H ;高字节数相加,同时加低字节产生的进位
MOV 51H ,A ;结果送51H单元 null3.4.3 带借位减法指令
SUBB A ,# data ;A ←(A) - data -(CY)
SUBB A ,direct ;A ←(A) -(direct)-(CY)
SUBB A ,Rn ;A ←(A) –(Rn)-(CY)
SUBB A ,@Ri ;A ←(A) -((Ri))-(CY)
减法指令对PSW中各标志位的影响情况如下:
借位标志CY:如D7位向上需借位,则CY=1;否则CY=0。
半借位标志AC:如D3位向上需借位,AC=1;否则AC=0。
溢出标志OV:若D7、D6位只有一个向上有借位,OV=1;若若D7、D6位同时有借位或同时无借位时,OV=0。
奇偶标志P:当A中“1”的个数为奇数时,P=1;为偶数时, P=0。
注:减法运算只有带借位减法指令,而没有不带借位的减法指令。若要进行低字节的减法运算,应该先用指令将CY清0,然后再执行SUBB指令。null例3-11 设(A)=DBH,(R4)=73H,(CY)=1。
执行指令 SUBB A,R4 则操作如下:
1 1 0 1 1 0 1 1 (DBH) 1 1 0 1 1 0 1 1
1 1 0 0 1 1 1 1 (73H) 1 0 0 0 1 1 0 1 (-73H补码)
-) 1 (CY) +) 1 1 1 1 1 1 1 1 (-1补码)
0 1 1 0 0 1 1 1 10 0 1 1 0 0 1 1 1
(a)常规减法 (b)减法变补码相加
结果:(A)=67H,(C)=0,(AC)=0,(OV)=1,(P)=1。
由上述二式可见两种算法的最终结果是一样的。在此
例中,若DBH和73H是两个无符号数,则结果67H是
正确的;反之,若为两个带符号数,则由于产生OV=1,使得结果是错误的,因为负数减正数其结果不可能是正数,OV=1,就指出了这一错误。 null3.4.4 加1指令
INC A ;A ←(A)+ 1
INC direct ;direct ←(direct)+ 1
INC Rn ;Rn ←(Rn)+ 1
INC @Ri ;Ri ←((Ri))+ 1
INC DPTR ;DPTR ←(DPTR)+ 1
这组指令的功能是将操作数所指定单元的内容加1。
3.4.5 减1指令
DEC A ;A ←(A)-1
DEC direct ;direct ←(direct)-1
DEC Rn ;Rn ←(Rn)-1
DEC @Ri ;Ri ←((Ri))-1
这组指令的功能是将操作数所指定单元的内容减1。
加1、减1指令均不影响PSW中的OV、CY、AC标志。null3.4.6 乘、除法指令
1.乘法指令
MUL AB ;BA←(A)×(B)
指令功能:把累加器A和寄存器B中的两个8位无符号数相乘,所得16位乘积的低8位放在A中,高8位放在B中。
乘法指令执行后会影响三个标志:
若乘积小于FFH(即B的内容为0),则OV=0,否则OV=1。CY=0,奇偶标志P仍按A中1的奇偶性来确定。
例3-12 已知(A)=80H,(B)=32H,
执行指令 MUL AB
结果:(A)=00H,(B)=19H,OV=1,CY=O,P=0。null2.除法指令
DIV AB ;A←(A)÷(B)之商,
B←(A)÷(B)之余数
功能:对两个8位无符号数进行除法运算。其中被除数存放在累加器A中,除数存放在寄存器B中。执行后,商存于累加器A中,余数存于寄存器B中。
除法指令执行后也影响三个标志:
若除数为0(即B=0)时,OV=1,表示除法没有意义;若除数不为0,则OV=0,表示除法正常进行。
CY=0,奇偶标志P仍按A中1的奇偶性来确定。
例3-13 已知:(A)=87H(135D),(B)=0CH(12D),
执行指令 DIV AB
结果(A)=0BH,(B)=03H,OV=0,CY=O,P=1。 null3.4.7 十进制调整指令
格式: DA A
功能:对A中刚进行的两个BCD码的加法结果自动进行修正。该指令只影响进位标志CY。
所谓BCD码就是采用四位二进制编码表示的十进制数。四位二进制数共有十六个编码,BCD码是取它前十个的编码0000~1001来代表十进制数的0~9,这种编码简称为BCD码。
如果两个BCD码数相加,结果也是BCD码,则该加法运算称为BCD码加法。在单片机中没有专门的BCD码加法指令,要进行BCD码加法运算,也要使用加法指令ADD或ADDC。然而计算机在执行ADD或ADDC指令时,是按照二进制规则进行的,对于4位二进制数是按逢16进位,而BCD码是逢十进位的,二者存在进位差。因此用ADD或ADDC指令进行BCD码相加时,可能会出现错误。使用DA A能对运算结果自动进行修正。
使用方法:在上述加法指令后面紧跟一条DA A指令。null例3-14 试编写程序,实现95+59的BCD码加法,并将结果存入30H、31H单元。
MOV A ,#95H ;95的BCD码数送A中
ADD A ,#59H ;两个BCD码相加,结果在A中
DA A ;对相加结果进行十进制调整
MOV 30H ,A ;十位个位的BCD码之和送30H
MOV A ,#00H ;A清0
ADDC A ,#00H ;加进位(百位的BCD码)
DA A ;BCD码相加后,用调整指令
MOV 31H ,A ;存进位
第一次执行DA A指令的结果:A=54H,CY=1,
最终结果:(31H)=01H,(30H)=54H。null若要进行BCD码减法运算,也应该进行调整,但不存在十进制减法调整指令,因此可将减法改为加法:加减数的补数。
两位十进制数是对100取补的.
例如减法 60-30=30,也可以改为补数相加:
60+(100-30)=130
去掉进位,就能得到正确的结果。
例3-15 编写程序实现十进制减法,计算87-38。
CLR C ;减法之前,先清CY位
MOV A ,#9AH ;9AH(即100)送A中
SUBB A , #38H ;做减法,38的补数送A中
ADD A ,#87H ;38的补数与87做加法,
DA A ;对相加结果进行调整。
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
:
减数求补数 与被减数相加
1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0
-) 0 0 1 1 1 0 0 0 +) 1 0 0 0 0 1 1 1
0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1
→十进制调整
1 1 1 0 1 0 0 1
+) 0 1 1 0 0 0 0 0
1 0 1 0 0 1 0 0 1
去掉进位,取调整结果的低8位,即得结果为十进制数49,显然是正确的结果
分析:
减数求补数 与被减数相加
1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0
-) 0 0 1 1 1 0 0 0 +) 1 0 0 0 0 1 1 1
0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1
→十进制调整
1 1 1 0 1 0 0 1
+) 0 1 1 0 0 0 0 0
1 0 1 0 0 1 0 0 1
去掉进位,取调整结果的低8位,即得结果为十进制数49,显然是正确的结果
3.5 逻辑运算及移位类指令3.5 逻辑运算及移位类指令 逻辑运算的特点:按位进行操作。
逻辑运算包括与、或、异或三种,此外还有移位指令以及对累加器A清零和求反指令。
3.5.1 逻辑与运算指令
ANL A ,#data ;A ←(A)∧data
ANL A ,direct ;A ←(A)∧(direct)
ANL A ,Rn ;A ←(A)∧(Rn)
ANL A ,@Ri ;A ←(A)∧((Ri))
ANL direct ,A ;direct ←(direct)∧(A)
ANL direct ,#data ;direct ←(direct)∧data
指令应用:用于将某些位屏蔽(即使之为0)。
方法是:将要屏蔽的位和“0”相与,
保留不变的位同“1”相与。 null3.5.2 逻辑或运算指令
ORL A ,#data ;A ←(A)∨data
ORL A ,direct ;A ←(A) ∨(direct)
ORL A ,Rn ;A ←(A) ∨(Rn)
ORL A ,@Ri ;A ←(A) ∨((Ri))
ORL direct ,A ;direct ←(direct) ∨(A)
ORL direct ,#data ;direct ←(direct) ∨data
指令应用:用于将某些位置位(即使之为1)。
方法是:将要置位的位和“1”相或,
要保留不变的位同“0”相或。null3.5.3 逻辑异或运算指令
XRL A ,#data ;A ←(A)data
XRL A ,direct ;A ←(A) ( direct)
XRL A ,Rn ;A ←(A) (Rn)
XRL A ,@Ri ;A ←(A) ((Ri))
XRL direct ,A ;direct ←(direct) (A)
XRL direct ,#data ;direct ←(direct) data
指令应用:用于将某些位取反。
方法是:将需求反的位同“1”相异或,
要保留的位同“0”相异或。 null例3-16 将累加器A的低4位送到P1口的低4位输出,而 P1的高4位保持不变。
解:这种操作不能简单地用MOV指令实现,而可以借助与、或逻辑运算。编程如下:
ANL A ,#0FH ;屏蔽A 的高4位,保留低4位
ANL P1 ,#0F0H ;屏蔽P1的低4位,保留高4位
ORL P1 ,A ;通过或运算,完成所需操作
例3-17 试编程,使内部RAM 30H单元中的低2位清0,高2位置1,其余4位取反。
解:ANL 30H ,#0FCH ;30H单元中低2位清0
ORL 30H ,#0C0H ;30H单元中高2位置1
XRL 30H ,#3CH ;30H单元中间4位变反null3.5.4.累加器清零、取反指令
累加器清零指令:
CLR A ;A ←0
累加器按位取反指令:
CPL A ;A ←( )
清零和取反指令只有累加器A才有,它们都是一字节指令,如果用其他方式来达到清零或取反的目的,则都为二字节的指令。
MCS-51系列单片机只有对A的取反指令,没有求补指令。若要进行求补操作,可按“求反加1”来进行。
以上所有的逻辑运算指令,对CY、AC和OV标志都没有影响,只在涉及到累加器A时,才会影响奇偶标志P。null3.5.5 循环移位指令
移位指令只能对累加器A进行移位,共有循环左移、循环右移、带进位的循环左移和右移四种。
循环左移 RL A ;A i+1←A i ,A 0 ←A 7
循环右移 RR A ;A i ←A i+1,A 7 ←A 0
带进位循环左移
RLC A ;A 0←CY,A i+1 ←A i,CY←A 7
带进位循环右移
RRC A ;A 7←CY,A i←A i+1,CY←A 0
前两条指令的功能分别是将累加器A的内容循环左移或右移一位;执行后仅影响PSW中的P标志;
后两条指令的功能分别是将累加器A的内容带进位位CY一起循环左移或右移一位;执行后影响PSW中的进位位CY和奇偶标志位P。以上移位指令,可用图形表示,如图3-6 所示。以上移位指令,可用图形表示,如图3-6 所示。举例:
例3-18:设(A)=08H,分析下面程序执行结果:
(1)RL A ;A的内容左移一位,结果(A)=10H
RL A ;A的内容左移一位,结果(A)=20H
RL A ;A的内容左移一位,结果(A)=40H
即左移一位,相当于原数乘2(原数小于80H时)。
(2)RR A ;A的内容右移一位,结果(A)=04H
RR A ;A的内容右移一位,结果(A)=02H
RR A ;A的内容右移一位,结果(A)=01H
即右移一位,相当于原数除2(原数为偶数时)。
举例:
例3-18:设(A)=08H,分析下面程序执行结果:
(1)RL A ;A的内容左移一位,结果(A)=10H
RL A ;A的内容左移一位,结果(A)=20H
RL A ;A的内容左移一位,结果(A)=40H
即左移一位,相当于原数乘2(原数小于80H时)。
(2)RR A ;A的内容右移一位,结果(A)=04H
RR A ;A的内容右移一位,结果(A)=02H
RR A ;A的内容右移一位,结果(A)=01H
即右移一位,相当于原数除2(原数为偶数时)。
3.6 控制转移类指令3.6 控制转移类指令51系列单片机有比较丰富的控制转移指令,包括无条件转移指令、条件转移指令和子程序调用及返回指令。这类指令的特点:自动改变PC的内容,使程序发生转移。
3.6.1 无条件转移指令
有四条无条件转移指令,提供了不同的转移范围。可使程序无条件地转到指令所提供的地址上去。
1.长转移指令
LJMP addr16 ;PC ← addr16
功能:把指令中给出的16位目的地址addr16送入程序计数器PC,使程序无条件转移到addr16处执行。
16位地址可寻址64KB ROM,故称为长转移指令,长转移指令是三字节指令,依次是操作码、高8位地址、低8位地址。null 2.绝对转移指令
AJMP addr11 ;PC ←(PC) + 2, PC10~0←addr11
这是一条二字节指令,其指令格式为:
a10 a9 a8 0 0 0 0 1
a7 a6 a5 a4 a3 a2 a1 a0
指令中提供了11位目的地址,其中 a7~a0 在第二字节,a10~a8 则占据第一字节的高3位,而00001是这条指令特有的操作码,占据第一字节的低5位。
绝对转移指令的执行分为两步:
第一步,取指令。此时PC自身加2指向下一条指令的起始地址(称为PC当前值)。
第二步,用指令中给出的11位地址替换PC当前值的低11位,PC高5位保持不变,形成新的PC值——即转移的目的地址。null11位地址的范围为00000000000~11111111111,即可转移的范围是2KB。转移可以向前也可以向后,如图3-7 所示。但要注意转移到的位置是与PC+2的地址在同一个2K区域,null例3-19 分析下面绝对转移指令的执行情况。
1234H:AJMP 0781H
分析:在指令执行前,(PC)=1234H;取出该指令后,(PC)+2 形成PC当前值,它等于1236H,即0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 B,指令执行过程:用指令给出的11位地址 1 1 1 1 0 0 0 0 0 0 1 B替换PC当前值的低11位,即新的PC值为1781H,所以指令执行结果就是转移到1781H处执行程序。
应注意:只有转移的目的地址与PC当前值在2K范围之内时,才可使用AJMP指令,超出2K范围,应使用长转移指令LJMP。null3.短转移指令
SJMP rel ;PC ←(PC) + 2,PC ←(PC) + rel
SJMP是无条件相对转移指令,该指令为双字节,
rel是相对转移偏移量。
指令的执行分两步完成:
第一步,取指令。此时PC自身加2形成PC的当前值。
第二步,将PC当前值与偏移量rel 相加形成转移的
目的地址送PC中。即:目的地址=(PC)+2 + rel
rel其范围为-128~+127,
这条指令的优点是:指令给出的是相对转移地址,
不具体指出地址值。当程序地址发生变化时,只要
相对地址不发生变化,该指令就不需要作任何改动。null4.变址寻址转移指令(称散转指令、间接转移指令)
JMP @A+DPTR ;PC ←(A)+(DPTR)
指令的功能:把累加器A中的8位无符号数与基址寄存器DPTR中的16位地址相加,所得的和作为目的地址送入PC。
该指令特点:转移地址可以在程序运行中加以改变。例如,在DPTR中装入多分支转移指令表的首地址,而由累加器A中的内容来动态选择应转向哪一条分支,实现由一条指令完成多分支转移的功能。
例3-20 设累加器A中存有用户从键盘输入的键值0~3,键处理程序分别存放在KPRG0、KPRG1、KPRG2、KPRG3位置处,试编写程序:根据用户输入的键值,转入相应的键处理程序。nullMOV DPTR,#JPTAB ;转移指令表首地址送DPTR
RL A ;键值×2,AJMP指令占2个字节
JMP @A+DPTR ;JPTAB+2×键值,和送PC中,则程序转移到表中某一位置去执行AJMP指令
JPTAB:AJMP KPRG0
AJMP KPRG1
AJMP KPRG2
AJMP KPRG3
KPRG0:
┇
KPRG1:
┇
KPRG2:
┇
KPRG3:
┇ null3.6.2 条件转移指令
条件转移指令是指当某种条件满足时,转移才进行;而条件不满足时,程序就按顺序往下执行。
条件转移指令的共同特点是:
(1)所有的条件转移指令都属于相对转移指令,转移范围相同,都在以PC当前值为基准的256B范围内(-128~+127);
(2)计算转移地址的方法相同:
转移地址=PC当前值 + rel
1.累加器判零转移指令
JZ rel ;若(A)=0,则转移,PC ←(PC)+2 + rel
;若(A)≠0,按顺序执行,PC ←(PC)+2
JNZ rel ;若(A) ≠ 0,则转移,PC ←(PC)+2+ rel
;若(A)=0,按顺