指令系统与程序设计.ppt

上传人:小飞机 文档编号:5736181 上传时间:2023-08-15 格式:PPT 页数:150 大小:777.50KB
返回 下载 相关 举报
指令系统与程序设计.ppt_第1页
第1页 / 共150页
指令系统与程序设计.ppt_第2页
第2页 / 共150页
指令系统与程序设计.ppt_第3页
第3页 / 共150页
指令系统与程序设计.ppt_第4页
第4页 / 共150页
指令系统与程序设计.ppt_第5页
第5页 / 共150页
点击查看更多>>
资源描述

《指令系统与程序设计.ppt》由会员分享,可在线阅读,更多相关《指令系统与程序设计.ppt(150页珍藏版)》请在三一办公上搜索。

1、1,第三章 指令系统与程序设计,3-1 指令与程序设计基础3-2 数据传送指令3-3 算术运算指令3-4 逻辑操作指令3-5 转移指令3-6 位操作指令3-7 综合程序设计,2,3-1 指令与程序设计基础,3.1.1 基本概念 指令:指挥计算机(CPU)完成各种操作的命令。机器语言指令:指令的二进制表示形式,即用一定位数的二进制编码表示操作命令,是指令在程序存储器中的存放形式,是CPU可直接读取、识别和执行的唯一形式。机器语言(目标)程序:用机器语言指令表示的程序。是所有程序的最终形式。例如,用MCS-51指令系统表示“10+6”运算的目标程序为:74 0A 24 06 80 FE 机器语言指

2、令和程序不便于阅读。汇编语言指令(符号指令、指令助记符):采用具有一定意义的符号来表示操作命令,使指令便于阅读。,3,3.1.1 基本概念,汇编语言(源)程序:用汇编语言指令书写的程序。例如,用MCS-51指令系统表示“10+6”运算的汇编语言程序为:MOV A,#10;将数10送入A中 ADD A,#6;常数6与A中内容相加,结果存入A SJMP$;结束 汇编语言指令必须最终转换为机器语言目标程序,才能为CPU所识别和执行。,4,3.1.1 基本概念,例如,用MCS-51指令系统表示“10+6”运算的汇编语言源程序和机器语言目标程序为:目标程序 汇编语言源程序 74 0A MOV A,#10

3、;将数10送入A中 24 06 ADD A,#6;常数6与A中内容相加,;结果存入A 80 FE SJMP$;结束高级语言程序:面向过程,必须经过编译或解释产生机器语言目标程序,方可由CPU所执行。,5,3.1.2 指令格式,汇编语言指令格式 操作码 操作数;注释 MOV A,#30H;将数30H送入A中 INC A;将A的内容加1 NOP;空操作 其中:操作码表示指令的功能(进行什么操作)操作数说明提供参与操作的数或数所在单元的地址机器语言指令 04 INC A;将A的内容加1 74 30 MOV A,#30H;将数30H送入A中 85 40 50 MOV 50H,40H;将40H单元内容送

4、入50H 机器语言指令有单字节、双字节、三字节指令。,6,3.1.3 程序设计基础,汇编语言、机器语言程序的书写格式 例:将片内数据存储器3AH单元内容与3BH单元内容互换。机器语言目标程序 汇编语言源程序 地址 指令代码 标号 操作码 操作数 注释 ORG 2000H;程序存放的起始地址2000H E5 3A ST:MOV A,3AH;3AH的内容暂存于A2002H 85 3B 3A MOV 3AH,3BH2005H F5 3B MOV 3BH,A2007H 80 FE LP:SJMP LP END;汇编结束 其中:ORG、END为伪指令(表示汇编要求的指令)。标号:指令的符号地址。,7,3

5、.1.3 程序设计基础,目标程序在存储器中的存储形式,8,3.1.3 程序设计基础,程序的执行过程 程序计数器PC:PC是一个16位寄存器,始终存放着CPU要取出执行的下一个机器指令代码的存放单元的地址。复位后,PC=0000H,因此CPU总是从0000H地址开始执行程序。CPU总是以PC的内容为地址从程序存储器中取指令代码。每取出一个字节的指令代码,PC内容自动加1,保证程序的顺序执行。遇到转移指令时,将目标地址置入PC,实现程序跳转执行逻辑。,9,3.1.3 程序设计基础,CPU执行指令的过程分为取指令、分析指令和执行三个阶段。上述例子程序执行过程如下:(PC的内容初值为2000H)CPU

6、按PC所指该指令取出2000H单元的指令代码E5H,PC加1,PC=2001H,对E5H进行译码得知该指令还有第二字节;CPU 取出2001H单元的操作数3AH,PC加1,PC=2002H执行第一条指令:将3AH中的数送入A;,10,3.1.3 程序设计基础,程序的基本结构顺序结构分支结构循环结构子程序,11,3.1.3 程序设计基础,程序流程图,12,3.1.3 程序设计基础,例:编制实现符号函数的程序,流程图如下:,13,3.1.3 程序设计基础,例:循环结构流程图,14,3.1.4 指令系统的寻址方式,指令系统的寻址方式规定了单片机内部地址单元或数据的访问方式。80C51指令系统的寻址方

7、式有7种 立即寻址方式:指令中使用常数来参与指令操作,由于这些常数能立即传送或赋值,故称为立即数。例:MOV A,#40H;立即数40H赋给A MOV DPTR,#2100H;立即数2100H赋给DPTR 寄存器寻址:指令中给出存放参加操作的数的寄存器。例:MOV A,R7;将R7内容送入A DIV AB;A内容除以B寄存器内容 直接寻址:指令中直接给出参加操作的数所在存储单元的地址。例:MOV A,50H;将片内数据存储器50H的内容送入A MOV B,A;A的内容送入B寄存器,15,3.1.4 指令系统的寻址方式,特殊功能寄存器SFR采用直接寻址时,指令中用寄存器符号表示。例:MOV A,

8、B 相当于 MOV A,0F0H寄存器间接寻址:由指令给出某一个寄存器内容作为操作数的地址,该地址所指单元内容为参加操作的数。访问片内数据存储器,间接寻址寄存器可用R0、R1,访问片外数据存储器可用DPTR。例:MOV A,R0;将R0所指单元内容送入A。执行过程:,16,3.1.4 指令系统的寻址方式,位寻址方式变址间接寻址方式(基址变址寻址方式)相对寻址方式,17,3-2 数据传送指令,数据传送指令的特点一般格式:MOV(MOVC、MOVX)目的操作数,源操作数 除此之外,还有数据交换指令和堆栈操作指令。功能:将源操作数内容送入目的操作数指定的存储空间,指令执行后,源操作数内容不变,目的操

9、作数内容被修改为源操作数内容。,18,片内数据存储器及寄存器的数据传送指令,19,片内数据存储器及寄存器的数据传送指令,20,片内数据存储器及寄存器的数据传送指令,例:已知R0=30H,片内数据存储器(30H)=50H,(40H)=60H,执行下列各指令后,A中内容是多少?MOV A,R0;A=30H MOV A,R0;A=50H MOV A,40H;A=60H MOV A,#40H;A=40H,21,片内数据存储器及寄存器的数据传送指令,例:分析执行下列程序段后,各相关存储单元和寄存器内容有何变化?MOV R0,#40H;R0=MOV A,R0;A=MOV 30H,A;(30H)=MOV 2

10、0H,30H;(20H)=MOV R0,#30H;(40H)=MOV 20H,R0;(20H)=MOV B,#10H;B=MOV DPL,20H;DPL=MOV DPH,B;DPH=,40H,40H,40H,40H,30H,30H,30H,10H,10H,22,片内数据存储器及寄存器的数据传送指令,指令图解,23,3.2.3 片外数据传送指令,特点:只能与A之间进行数据传送 只能采用寄存器间接寻址方式,24,3.2.3 片外数据传送指令,例:编程将片外数据存储器2040H单元的内容传送到3000H单元。ORG 1000H MOV DPTR,#2040H MOVX A,DPTR;2040H单元内

11、容送入A MOV DPTR,#3000H MOVX DPTR,A;A的内容送入3000H单元 LP:SJMP LP,25,3.2.4 查表指令,程序存储器主要用来存放程序,也可存放表格常数,要取出表格常数时,可以采用查表指令。特点 只能将表格常数读入A中 表格常数采用变址间接寻址方式,26,3.2.4 查表指令,指令功能说明例:已知DPTR=2000H,A=E0H,则执行MOVC A,A+DPTR过程如下图所示:,27,3.2.4 查表指令,应用例:用查表方法求片内数据存储器30H单元内容(09)的平方值,并存入31H单元。分析:假设先将09的平方 值连续存放在程序存储器 3000H开始的单元

12、中。则 每个平方值存放的单元地 址=表格首地址+偏移量(索引值),而该索引值 即为待求平方值的数。,28,3.2.4 查表指令,方法1:ORG 2000H MOV A,30H;取数MOV DPTR,#3000H;表格首地址送入DPTRMOVC A,A+DPTR;查表取平方值 MOV 31H,A;存结果LP:SJMP LPORG 3000H DB 0,1,4,9,16,25DB 36,49,64,81;平方值表 DB(定义字节伪指令)格式:标号:DB 8位二进制数表,29,3.2.4 查表指令,方法2:ORG 2000H MOV A,30H;取数 ADD A,#TAB-NPC;加偏移量 MOVC

13、 A,A+PC;查表 NPC:MOV 31H,A;存结果 LP:SJMP LP TAB:DB 0,1,4,9,16,25 DB 36,49,64,81;平方值表,30,3.2.4 查表指令,方法2:ORG 2000H2000H E5 30 MOV A,30H;取数2002H 24 04 ADD A,#04H;加偏移量2004H 83 MOVC A,A+PC;查表2005H F5 32 NPC:MOV 31H,A;存结果2007H 80 FE LP:SJMP LP2009H 00 TAB:DB 0,1,4,9,16,25200AH 01 DB 36,49,64,81;平方值表 偏移量=TAB-N

14、PC=2009H-2005H=04H,31,3.2.4 查表指令,例:利用查表法求函数y=f(x),其中x与y对应关系如下:假设x值在40H中,将y值存入50H、51H(高8位)。分析:假设将y值存入2500H开始的程序存储器。则每个y值第一字节所在单元地址=表格首地址+2x。,32,3.2.4 查表指令,ORG 2100HMOV A,40H;取x值ADD A,40H;求2xMOV R5,A;暂存MOV DPTR,#2500H;表格首地址MOVC A,A+DPTR;取低字节MOV 50H,AMOV A,R5INC A;2X+1MOVC A,A+DPTR;取高字节MOV 51H,A LP:SJM

15、P LPORG 2500HDW 4000H,4050H,4200H,420DH,4360H,5600H,5900H,33,3.2.5 交换指令,34,3.2.5 交换指令,数据交换指令图解,35,3.2.5 交换指令,例:已知A=34H,R1=50H,片内数据存储器(50H)=56H,分析执行下列指令的结果。XCH A,R1;A=,R1=XCH A,R1;A=,(50H)=XCHD A,R1;A=,(50H)=SWAP A;A=,50H,34H,56H,34H,36H,54H,43H,36,小结:不同存储空间的操作,MOV指令,37,不同存储空间的操作,片外数据存储器与程序存储器使用相同的地址

16、,但不会造成操作冲突。例:片外数据存储器 程序存储器 MOV A,#0MOV DPTR,#3000H MOV DPTR,#3000HMOVX A,DPTR MOVC A,A+DPTR 读信号:读选通信号:地址空间相同,控制信号不同!,38,3-3 算术运算指令,3.3.1 带符号数的表示方法符号数值化 数学上表示带符号数:X=+25=+11001B Y=25=11001B(真值)计算机中,若用8位二进制数表示一个带符号数,则规定:最高位D7表示数的符号,D7=0表示正数,D7=1表示负数;其余位D6D0表示数值大小。这样的数称为机器数。机器数可用不同的码制来表示,常用的有原码和补码。,39,3

17、.3.1 带符号数的表示方法,带符号数表示方法原码表示法(符号-绝对值表示)例:X=+25=+11001B 则 X原=0001 1001 Y=-25=-11001B 则 Y原=1001 1001 8位原码表示范围为:-127+127补码表示法 正数补码与原码表示法相同;负数Y的补码用2n-Y表示或将其原码数值部分取反后加1得到。例:X=+25=+11001B 则 X补=0001 1001 Y=-25=-11001B 则 Y补=1110 0111约定:-128补=1000 0000 8位补码表示范围为:-128+127 已知补码求原码 X补补=X原,40,3.3.1 带符号数的表示方法,补码运算

18、 补码的加法规则是:X+Y补=X补+Y补 补码的减法规则是:X-Y补=X补+-Y补 例:已知X=+57,Y=-75,利用补码运算求X+Y=?解:X=+57=+011 1001B Y=-75=-100 1011B X原=0011 1001 Y原=1100 1011 X补=0011 1001 Y补=1011 0101 则X+Y原=1001 0010 所以 X+Y=-10010B=-18,X补 0011 1001+)Y补 1011 0101 X+Y补 1110 1110,41,3.3.1 带符号数的表示方法,程序状态字寄存器PSW PSW是一个8位寄存器,用来存放运算结果的一些特征信息。CY:进位标

19、志。在进行加法(或减法)运算时,若运算结果最高位有进位(或借位)时CY=1,否则CY=0。AC:半进位标志。在进行加法(或减法)运算时,若低半字节向高半字节有进位(或借位)时AC=1,否则AC=0。OV:溢出标志。两个带符号数运算,若结果超出-128+127时为溢出,OV=1,否则OV=0。P:奇偶标志。若A中内容“1”的个数为奇数个时P=1,否则P=0。,42,3.3.1 带符号数的表示方法,RS1、RS0:工作寄存器组选择位。用于选择当前工作寄存器组。F1、F0:用户标志位。,43,3.3.1 带符号数的表示方法,例:其中CS为D6向D7的进位标志。分析:1.若将数据当作无符号数进行运算,

20、则CY=1表示结果大于255。2.若将数据当作带符号数进行运算,则OV=1表示溢出,结果出错;OV=0,结果正确。,0 1 0 1 0 1 0 0+)0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 CY=0 AC=0 P=0 OV=CSCY=1,1 1 0 0 1 0 1 1+)1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1CY=1 AC=1 P=0OV=CS CY=0,44,3.3.2 加法指令,45,3.3.2 加法指令,例:假设A=C3H,R0=AAH,求执行指令ADD A,R0的结果。结果:A=6DH,CY=1,AC=0,OV=1,P=1,1 1 0

21、 0 0 0 1 1 B+)1 0 1 0 1 0 1 0 B 1 0 1 1 0 1 1 0 1 B,46,3.3.3 带进位加法指令,带进位加法指令常用于多字节数相加。,47,3.3.3 带进位加法指令,例:片内RAM 30H,31H和40H,41H分别存放一个两字节无符号数,编程将两数相加,并将结果存入30H开始的单元。ORG 1000H MOV A,30H;取第一数低字节ADD A,40H;加上第二数低字节MOV 30H,A;存结果低字节MOV A,31H;取第一数高字节ADDC A,41H;加上第二数高字节及进位MOV 31H,A MOV A,#0ADDC A,#0;高字节相加的进位

22、MOV 32H,ASJMP$,48,3.3.4 带借位减法指令,49,3.3.5 加1指令,加1指令仅操作数为A时会影响P标志,对其他标志均无影响。,50,3.3.6 减1指令,减1指令仅操作数为A时会影响P标志,对其他标志均无影响。,51,3.3.7 乘、除指令,二进制数的乘、除法运算方法类似于十进制数的运算。,52,3.3.8 十进制调整指令,二-十进制编码(BCD码)BCD码是二进制编码的十进制数,用四位二进制数给09这10个数字编码,既考虑计算机的使用特点,又顾及人们使用十进制数的习惯。例:94=1001 0100BCD 反之:1 0010 0101BCD=125 BCD码与二进制码、

23、十六进制码的互换均先转换为十进制数。BCD码的运算,53,3.3.8 十进制调整指令,例(1)(2),0 0 1 1 0 1 0 1BCD 35+)0 1 0 0 0 0 0 1BCD 41 0 1 1 1 0 1 1 0BCD 76,0 1 0 1 0 1 1 0BCD 56+)0 0 1 1 1 0 0 0BCD 38 1 0 0 0 1 1 1 0非BCD码,必须进行调整。,54,3.3.8 十进制调整指令,十进制调整规则 若结果低4位大于9或AC=1,则补加06H调整。若结果高4位大于9或CY=1,则补加60H调整。例:,0 1 0 1 0 1 1 0BCD 56+)0 0 1 1 1

24、 0 0 0BCD 38 1 0 0 0 1 1 1 0非BCD码+)0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0BCD 94,55,3.3.8 十进制调整指令,十进制调整指令 注意:DA A指令仅对BCD码加法运算结果进行调整。使用时紧跟ADD(ADDC)指令之后。MOV A,#56H ADD A,#38H DA A,56,3.3.9 算术运算指令图解,57,3.4 逻辑运算指令,3.4.1 逻辑与运算指令,58,3.4.1 逻辑与运算指令,二进制数的逻辑与运算 00=0 10=0 01=0 11=1 例:逻辑与运算常用来将一个数据的某些位清零(屏蔽),而保持其他位不变。例

25、:将30H单元的高4位清零,低4位保持不变,可用下面指令实现。ANL 30H,#0FH,1 0 1 1 0 0 1 1B)0 1 1 1 1 1 0 1B 0 0 1 1 0 0 0 1B,59,3.4.2 逻辑或运算指令,60,3.4.2 逻辑或运算指令,二进制数的逻辑或运算 0v0=0 1v0=1 0v1=1 1v1=1 例:逻辑或运算常用来将一个数据的某些位置1,而保持其他位不变。例:将30H单元的低4位置1,高4位保持不变,可用下面指令实现。ORL 30H,#0FH,1 0 1 0 0 0 0 1 Bv)0 1 1 0 1 1 0 1 B 1 1 1 0 1 1 0 1 B,61,3.

26、4.3 逻辑异或运算指令,62,3.4.3 逻辑异或运算指令,二进制数的逻辑异或运算 0 0=0 1 0=1 0 1=1 1 1=0 例:逻辑异或运算常用来将一个数据的某些位取反,而保持其他位不变。例:将A的奇数位取反而偶数位保持不变,可用下面指令实现。XRL A,#0AAH(XRL A,#1010 1010B),1 0 1 0 0 0 0 1B)0 1 1 0 1 1 0 1B 1 1 0 0 1 1 0 0B,63,3.4.4 累加器清零、取反指令,64,3.4.4 累加器清零、取反指令,例:将累加器A的内容去取反。(1)CPL A(2)XRL A,#0FFH例:将累加器A清零。(1)CL

27、R A(2)ANL A,#0(3)MOV A,#0,65,3.4.5 循环移位指令,66,3.4.6 并行I/O口的操作及工作原理,并行I/O口的操作MCS-51单片机有4个8位并行I/O口P0P3,作输入输出时将其当作特殊功能寄存器来使用,不设专门的输入/输出指令。输入/输出操作输出:直接输出。例如从P1口输出数据 MOV P1,A 或 MOV P1,#35H 或 MOV P1,40H 或 MOV P1,R2,67,3.4.6 并行I/O口的操作及工作原理,输入:先向端口写入“1”,然后输入数据。例如从P1口输入数据MOV P1,#0FFHMOV A,P1例:将P1口高4位输入的内容从低4位

28、输出。MOV P1,#0F0H;P1口高4位为输入MOV A,P1;输入SWAP A;高低4位交换MOV P1,A;输出,68,3.4.6 并行I/O口的操作及工作原理,“读-修改-写”操作在逻辑操作指令中,当目的操作数为P0P3口时,进行“读-修改-写”操作。例:ANL P1,A;将P1口原来的输出信号“读”入,“与”A(修改)后,从P1口输出(写)ORL P1,#0FH;将P1口原来的输出信号“读”入,“或”立即数0FH(修改)后,从 P1口输出(写),69,3.4.6 并行I/O口的操作及工作原理,并行I/O口的工作原理 P0口输出,70,3.4.6 并行I/O口的操作及工作原理,P0口

29、输入,输入为读引脚操作,输入前应先输出“1”使T2截止,才能正确输入引脚状态。,71,3.4.6 并行I/O口的操作及工作原理,“读-修改-写”操作,72,3.4.6 并行I/O口的操作及工作原理,P1口,73,3.4.6 并行I/O口的操作及工作原理,P2口,74,3.4.6 并行I/O口的操作及工作原理,P3口,75,3.4.7 逻辑运算指令图解,逻辑运算指令只有目的操作数为A时会影响P,对其他标志无影响。,76,3.5 控制转移指令,控制转移指令的功能就是改变程序计数器PC的内容,控制程序从原顺序执行地址转移到其他指令地址上。计算机在运行过程中,有时因为任务要求,程序不再按顺序逐条执行指

30、令,需要改变程序运行的方向,此时需要改变程序计数器PC的内容。控制转移类指令正是为实现这一功能而设置的。控制转移指令有无条件转移指令和条件转移指令。,77,3.5.1 无条件转移指令,当程序执行这类指令时,就无条件地转移到指令所提供的地址(目标地址)上,指令提供目标地址的方法有多种。长转移指令LJMP addr16;addr16为转移的目标地址,采用的寻址方式为直接寻址(绝对寻址)。指令功能:将addr16送入PC,使程序从当前地址(下一条指令的PC值)转移到addr16执行。在程序中,addr16用标号表示。例:LJMP NEXT NEXT:,78,3.5.1 无条件转移指令,相对转移指令

31、SJMP rel rel是转移的目标地址相对于当前PC值的偏移量,8位带符号数,其范围为-128+127。指令采用的寻址方式为相对寻址方式。,79,3.5.1 无条件转移指令,理解相对寻址方式:描述从A走到B的方法有两种:从2KM(A)走到5KM(即B)处 从2KM(A)向前走3KM 描述直接给出目的地,相当于LJMP指令 描述给出的是B相对于A的距离,相当于SJMP指令,80,3.5.1 无条件转移指令,相对转移指令的功能:将程序转移到PC+2+rel地址执行。其中PC为SJMP指令所在地址。例:2000H SJMP 08H;程序跳转至2000H+2H+08H=200AH执行 例:2100H

32、 SJMP 0F5H;程序跳转至2100H+2H+(-0BH)=20F7H执行 在程序中,rel用目标地址标号表示。例:SJMP NEXT NEXT:,81,3.5.1 无条件转移指令,指令 LOOP:SJMP LOOP 也可写成 SJMP$短转移指令 AJMP addr11,82,3.5.1 无条件转移指令,间接长转移指令(散转指令)JMP A+DPTR 转移的目标地址为A+DPTR的内容,但不影响A与DPTR的内容 例:编程实现,根据片内RAM 30H单元内容(09)转移至入口地址为OPR0OPR9的程序段执行。方法一:利用转移指令表首先利用LJMP指令建立转移至OPR0OPR9的转移指令

33、表;然后根据30H内容,利用JMP指令转移至表中对应的指令。,83,3.5.1 无条件转移指令,MOV A,30H;取30H内容 ADD A,30H ADD A,30H;X3 MOV DPTR,#JPTAB JMP A+DPTRJPTAB:LJMP OPR0 LJMP OPR1.LJMP OPR9,84,3.5.1 无条件转移指令,方法二:利用转移地址表 首先将各入口地址连续存放在程序存储器中,形成转移地址表,然后编程根据30H内容查表取得相应的入口地址,最后利用JMP指令转移至相应程序段。,85,3.5.1 无条件转移指令,MOV A,30H;取数ADD A,30H;X2MOV R5,A;暂

34、存于R5MOV DPTR,#TAB;DPTR指向地址表MOVC A,A+DPTR;取地址高8位 MOV B,A;地址高8位暂存入BMOV A,R5INC AMOVC A,A+DPTR;取地址低8位MOV DPL,AMOV DPH,B;入口地址送入DPTR MOV A,#0JMP A+DPTRTAB:DW OPR0,OPR1,OPR2,86,3.5.2 子程序调用与堆栈,子程序,为保证子程序顺利返回,在调用时,必须将当前PC(断点地址)压入堆栈保护。,87,3.5.2 子程序调用与堆栈,堆栈 什么是堆栈?是RAM中一个 专用的连续存 储区,是一种 单端读写操作 的存储结构。51单片机的堆 栈在片

35、内RAM 开辟。,88,3.5.2 子程序调用与堆栈,堆栈指针(SP):8位寄存器,用来存放堆栈的栈顶地址。单片机复位后,SP=07H。堆栈的操作压入堆栈:SP自动加1,数据进栈。弹出堆栈:数据出栈,SP自动减1。例:假设SP=70H,将数据12H、34H依次压入堆栈的过程如下。,89,3.5.2 子程序调用与堆栈,SP自动加1,SP=71H;将数据12H压入SP所指的堆栈单元(71H);SP自动加1,SP=72H;将数据34H压入SP所指的堆栈单元(72H)。如图所示:初始状态,90,3.5.2 子程序调用与堆栈,反之,现在要将堆栈单元的内容弹出的话,过程如下:将SP所指堆栈单元(72H)的

36、内容34H弹出;SP自动减1,SP=71H;将SP所指堆栈单元(71H)的内容12H弹出;SP自动减1,SP=70H。初始状态,91,3.5.2 子程序调用与堆栈,堆栈操作的原则:先进后出,后进先出。堆栈的作用:用来保护断点地址和保护现场。堆栈操作指令 压入堆栈 PUSH direct;SP先自动加1,然后将direct单元 内容压入SP所指的堆栈单元 弹出堆栈 POP direct;先将SP所指堆栈单元的内容弹给 direct,然后SP自动减1,92,3.5.2 子程序调用与堆栈,子程序调用与返回指令调用指令 LCALL addr16;先将当前PC值(断点地址)压入 堆栈,然后将子程序入口地

37、址addr16 送入PC,转入子程序执行返回指令 RET;将断点地址从堆栈单元弹出送入PC,返回主程序继续执行,93,3.5.2 子程序调用与堆栈,子程序的编写与应用编写子程序应注意的问题子程序在功能上应具有通用性,结构上具有独立性;给子程序赋一个名字,实际上是入口地址的代号;注意保护现场和恢复现场;应有子程序相关说明:如子程序的功能、入口条件、出口条件、占用寄存器或存储单元的情况。,94,3.5.2 子程序调用与堆栈,应用 例:编程实现c=a2+b2,设a、b均小于10,a存在31H,b存在32H,c存入33H。设计求平方值子程序SQR:功能:求平方值 入口条件:待求数存入A 出口条件:平方

38、值存于A 使用寄存器:A,B 程序清单:,95,3.5.2 子程序调用与堆栈,ORG 2000H;子程序2000H C0 F0 SQR:PUSH B;保护现场2002H F5 F0 MOV B,A2004H A4 MUL AB;求平方值2005H D0 F0 POP B;恢复现场2007H 22 RET;返回 ORG 2100H;主程序2100H 75 81 70 MOV SP,#60H;设置堆栈指针2103H E5 31 MOV A,31H;取a 2105H 12 20 00 LCALL SQR;调用子程序求a22108H F9 MOV R1,A;a2暂存入R1,96,3.5.2 子程序调用

39、与堆栈,2109H E5 32 MOV A,32H;取b210BH 12 20 00 LCALL SQR;调用子程序求b2210EH 29 ADD A,R1;求a2+b2210FH F5 33 MOV 33H,A;存结果2111H 80 FE SJMP$第一次调用时堆栈单元状态 第二次调用时堆栈单元状态,97,3.5.2 子程序调用与堆栈,子程序嵌套子程序嵌套是指在子程序执行过程中还可以调用另一个子程序。子程序嵌套的过程假设某一主程序在执行的过程中调用子程序1,子程序1执行的过程中又调用子程序2,则子程序嵌套的过程及对堆栈的操作如下图所示:,98,3.5.2 子程序调用与堆栈,堆栈先进后出的操

40、作原则保证子程序嵌套的实现。,99,3.5.3 条件转移指令,判零条件转移指令JZ rel;若A=0转移至PC+2+rel,否则顺序执行JNZ rel;若A0转移至PC+2+rel,否则顺序执行例:编程实现下列函数假设x存放在片内RAM 30H单元,将y值存入31H。,100,3.5.3 条件转移指令,ORG 1000H MOV A,30H;取x值 JZ ZERO;x=0转移至ZERO MOV 31H,#1;x0则y=1 SJMP$ZERO:MOV 31H,#0;x=0则y=0 SJMP$方法二:对存储单元采用间接寻址方式,101,3.5.3 条件转移指令,ORG 1200H MOV R0,#

41、30H;设置指针 MOV A,R0;取x值 JZ LING;x=0则转移至LING INC R0 MOV R0,#1;x0则y=1 SJMP$LING:INC R0 MOV R0,#0;x=0则y=0 SJMP$,102,3.5.3 条件转移指令,比较转移指令CJNE A,#data,relCJNE A,direct,relCJNE Rn,#data,relCJNE Ri,#data,rel 上述4条指令有3个操作数,具有共同的格式CJNE OPR1,OPR2,rel 第三操作数均采用相对寻址方式,103,3.5.3 条件转移指令,指令功能 若OPR1=OPR2则不转移 若OPR1OPR2则转

42、移至PC+3+rel且CY=0 若OPR1OPR2则转移至PC+3+rel且CY=1 即:对第一、二操作数的内容(无符号数)进行比较,若二者相等则顺序执行,否则转移,同时影响CY标志。可用作比较指令。,104,3.5.3 条件转移指令,例:编程实现下列函数假设x存放在片内RAM 30H单元,将y值存入31H。(用CJNE指令实现),105,3.5.3 条件转移指令,ORG 2000H MOV A,30H;取x值 CJNE A,#0,NEQ;若x0则转移至NEQ MOV 31H,#0 SJMP$NEQ:MOV 31H,#1 SJMP$,106,3.5.3 条件转移指令,减1非零转移指令DJNZ

43、Rn,rel;Rn内容减1,若Rn0则转移至PC+2+rel,若Rn=0则顺序执行DJNZ direct,rel;direct单元内容减1,若(direct)0则转移至PC+3+rel,若(direct)=0则顺序执行例:编程将片外数据存储器3000H开始的50个数传送到片内RAM 30H开始的存储单元中。,107,3.5.3 条件转移指令,流程图:,108,3.5.3 条件转移指令,ORG 0050H MOV DPTR,#3000H;源数据块首地址 MOV R0,#30H;目的存储单元首地址 MOV R5,#50;循环次数(数据块长度)LP:MOVX A,DPTR;从源数据块取一个数 MOV

44、 R0,A;送入目的存储单元 INC DPTR INC R0;指向下一单元 DJNZ R5,LP;未传送完,继续 SJMP$;结束,109,3.5.4 CPU时序与软件延时,问题的提出 请看程序段:.MOV R7,#100 DELAY:DJNZ R7,DELAY.该程序段只是一个空循环,没有实质的操作,但指令的执行是需要时间的,因此,它起到延时作用。延时时间的长短与指令执行所需的时间和循环次数有关。,110,3.5.4 CPU时序与软件延时,CPU时序 振荡器和时钟电路 内部时钟方式 晶体或陶瓷谐振器 的频率范围 fosc=1.2MHz 12MHz,111,3.5.4 CPU时序与软件延时,外

45、部时钟方式,112,3.5.4 CPU时序与软件延时,与时序有关的概念 时钟周期Tosc=1/fosc 机器周期TM=12Tosc=12/fosc 指令周期:执行一条指令所需的时间,用机器周期数表示,一般为1 TM、2TM、4TM。例:若fosc=6MHz,则 Tosc=1/fosc=1/6s(微秒);TM=12Tosc=2 s,113,3.5.4 CPU时序与软件延时,软件延时程序例:YS1:MOV R7,#100;1 TM YS10:DJNZ R7,YS10;2 TM RET;2 TM延时时间t=1 TM+2 TM 100+2 TM=203 TM若fosc=12MHz则TM=1s;t=20

46、3 s,114,3.5.4 CPU时序与软件延时,例:多重循环内循环延时时间t1=2 TM 200外循环延时时间t2=(1 TM+2 TM 200+2 TM)100总延时时间t=1 TM+(1 TM+2 TM 200+2 TM)100+2 TM=40303 TM,115,3.5.4 相对寻址方式指令的汇编,偏移量rel的计算rel=转移的目标地址-当前PC值=转移的目标地址-转移指令地址-转移指令字节数举例 ORG 2000H2000H E5 30 MOV A,30H 2002H B4 00 rel CJNE A,#0,NEQ 2005H 75 31 00 MOV 31H,#02008H 80

47、 FE SJMP$200AH 75 31 01 NEQ:MOV 31H,#1200DH 80 FE SJMP$rel=200AH-(2002H+3)=200AH-2002H-3=05H,116,3.5.4 相对寻址方式指令的汇编,ORG 1680H1680H 7F 64 YS2:MOV R7,#1001682H 7E C8 YS20:MOV R6,#2001684H DE rel1 YS21:DJNZ R6,YS211686H DF rel2 DJNZ R7,YS201688H 22 RET rel1=1684H-1684H-2=-2 补码为:FEH rel2=1682H-1686H-2=-6

48、 补码为:FAH,117,3.6 位操作指令,MCS-51单片机有一个位处理器(布尔处理器),以进位位Cy为累加器(位累加器C)。可位寻址单元包括片内RAM 20H2FH及部分特殊功能寄存器。位地址表达方式直接位地址方式。如D4H点操作符方式。如PSW.4;D0H.4位名称方式。如RS1用户定义名方式。,118,3.6.1 位传送指令,位传送指令MOV C,bit;将位地址bit 的内容送入CMOV bit,C;将C的内容送入bit例:已知片内RAM(20H)=05H,执行MOV C,00HMOV 07H,C之后:片内RAM(20H)=85H,119,3.6.2 位修正指令,位清0指令CLR

49、C;将Cy清0CLR bit;将bit清0位取反指令CPL CCPL bit位置1指令SETB CSETB bit,120,3.6.3 位逻辑运算指令,与ANL C,bitANL C,/bit或ORL C,bitORL C,/bit例:已知x、y、z均为位地址,编程实现,121,3.6.3 位逻辑运算指令,MOV C,yANL C,/xMOV z,CMOV C,xANL C,/yORL C,zMOV z,C上述程序段实现z=xy运算,122,3.6.4 判位转移指令,指令JC rel;若Cy=1则转移至PC+2+rel 若Cy=0则顺序执行JNC rel;若Cy=0则转移至PC+2+rel 若

50、Cy=1则顺序执行JB bit,rel;若(bit)=1则转移至PC+3+rel 若(bit)=0则顺序执行JNB bit,rel;若(bit)=0则转移至PC+3+rel 若(bit)=1则顺序执行JBC bit,rel,123,3.6.4 判位转移指令,应用例:编程根据片内RAM 30H单元的内容等于、大于、小于60进行不同操作。MOV A,30HCJNE A,#60,NEQ EQ:.;(30H)=60的操作NEQ:JNC BIG.;(30H)60的操作,124,3.6.4 判位转移指令,例:编程实现下列函数功能其中x存在片内RAM 40H单元,将y存入41H单元。(提示:注意计算机中带符

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号