第四章 指令系统及汇编语言程序设计
任课教师:刘忠国 山东大学课程中心网站: http://course.sdu.edu.cn/G2S/stcmcu.cc 网站:http://www.mcu001.com keil μvision软件下载及指导手册(Help→μvision Help) http://www.keil.com/ 何宾STC单片机原理及应用 > http://www.gpnewtech.com/study/stc/
第四章 指令系统及汇编语言程序设计 本章学习目标 了解助记符、指令格式 掌握单片机寻址方式 掌握单片机指令系统 掌握单片机汇编语言程序设计及开发环境 13:42:57
第四章 指令系统及汇编语言程序设计语言 4.1 编程语言 4.2 指令格式及其分类 4.3 寻址方式 4.4 数据传送类指令 4.4 数据传送类指令 4.5 逻辑操作类指令 4.6 算术运算类指令 4.7 位操作指令 4.8 控制类转移指令 4.9 汇编语言程序设计 4.10 汇编语言程序调试 4.11利用ISP工具将程序下载到单片机中验证程序 13:42:57
§4.1 编程语言 1、指令及指令系统 指令是计算机完成某种指定操作的命令,程 序是以完成一定任务为目的指令的有序组合。 指令的集合构成指令系统。 2、指令两种形式 (在CPU的同一指令系统中) 汇编指令的形式:人们进行编写、调试程序使 用的形式; 机器指令的形式:是机器所能识别的二进制数 或十六进制数的形式。 13:42:57
§4.1编程语言 编写计算机程序有三种不同层次的计算机语言: 机器语言, 汇编语言和高级语言(不针对具体cpu)。 机器语言 缺点是不直观,不易识别、理解和记忆,因此 编写、调试程序时都不采用这种形式的语言。 13:42:57
汇编语言(Assembly Language) 是用英文缩写形式的助记符书写的指令,地址、数据也可用符号表示。 优缺点:与机器语言程序相比,编写、阅读和修改都比较方便,不易出错。但用汇编语言编写的源程序必须进行汇编。 目前,常用计算机软件自动完成汇编工作。 不同的CPU具有不同的汇编语言,一般不能通用。 在实际系统中,对程序执行速度要求较高而软件处理功能有限的场合,以及对硬件操作有较强的针对性的场合,常用汇编语言编程。 13:42:57
高级语言(High Level Language) 优缺点:不针对某种具体的计算机,通用性强。用 高级语言编程不需了解计算机内部的结构和原理, 这种语言的形式更接近英语,对于非计算机专业的 人员比较易于掌握。 高级语言程序易读、易编写,程序结构比较简洁, 大量用于科学计算和事务处理。 用高级语言编写的源程序同样必须编译后,计算机 才能执行。编译程序比汇编程序复杂得多,需要占 用较大容量的存储器,编译的过程也要花费更多的 时间。 13:42:57
4.1.1 助记符语言 4.1.2 操作码 汇编语言的指令由操作码和操作数组成。 操作码用规定的英文缩写字母组成,称为助记符。例如: 4.1.1 助记符语言 汇编语言的指令由操作码和操作数组成。 操作码用规定的英文缩写字母组成,称为助记符。例如: MOV A, #76H 表示将十六进制的数据76H送到累加器A中, 二进制机器语言是:01110100和01110110 十六进制数是:74H,76H。 74H: 操作码, 将一个数据传送到累加器A; 76H: 操作数。 4.1.2 操作码 操作码功能:表示对操作数进行什么操作。 表示形式:由英文缩写字母组成,容易理解和记忆。 例, MOV: 数据的传送; ADD:数据相加; ANL: 逻辑与 13:42:57
4.1.3 操作数 操作数功能:指出对什么数进行操作以及将操作的结 果放到何处。 4.1.3 操作数 操作数功能:指出对什么数进行操作以及将操作的结 果放到何处。 操作数的表示形式:可以是参与操作的数据,也可以 是参与操作的数据所在存储器的地址,还可以是数据 所在的寄存器等不同形式。 寻找这些不同形式的操作数的方式称为寻址方式。 立即数 定义:汇编语言指令中, 直接参与操作的数据。 表示方法:十进制格式、十六进制格式、二进制格式。 数据进制区分是在数据后面加后缀:十进制数后缀为D或省略,十六进制数后缀为H, 二进制数后缀为B。 MOV A, #76H 13:42:57
立即数 注意 参与操作的数据的位数要与参与操作的环境相匹配。 例如,指令MOV A, #71H,立即数71H是8位二进制 数01110001B的十六进制格式,而A是8位的寄存器, 所以给8位寄存器送的数据不能超出8位。 同理,给十六位寄存器送的数据不能超出16位。 MOV DPTR, #1234H 数据只能是整数的格式,不能是小数的格式。逻辑 数据也和二进制数据的表示一样,可以用十进制、 十六进制、二进制的数据格式表示。 13:42:57
立即数 当汇编指令中的数据是十六进制且是以字母开头时, 该数据应加一个前导0,以表示后面的字母不是变量 而是数字。 MOV A, #0FFH, 在8051内核单片机中,一个数据的前面有前缀#号则 表示后面的数据是立即数,如果数据的前面没有#号, 则说明该数据表示的是直接地址。 13:42:57
§4.2 指令格式及其分类 4.2.1 汇编语言的一般格式 标号: 指令助记符 目的操作数, 源操作数 ; 注释 1、标号 4.2.1 汇编语言的一般格式 标号: 指令助记符 目的操作数, 源操作数 ; 注释 1、标号 标号也叫做标识符(或符号地址),放在指令之前,是 其后指令所在地址的名字,必须跟一冒号":"。 标号的作用 标号用于表示某条指令跳转时的目标地址。 程序在修改和调试时,指令所在的实际地址往往会 随之变化,而代表地址的名字可以不变。因此,使 用标号,可以给编程和修改带来极大的方便。 不是每条指令都需要标号,通常在该指令作为跳转 或调用的目的地址时需要标号。 13:42:57
标号的命名必须遵循下列规则: 标号由字母(a~z或A~Z)、数字(0~9)或某些特殊字符(下划线_、@、?等)组成; 标号长度不允许超过31个字符; 标号不能与指令助记符相同。 符合上述规则的标号: NEXT_1 AA1Q MCCl MODEL?? _DELAY 不符合上述规则的标号: 5FVM -F33G ? MOV ADD XOR 其中最后三个标号均为指令助记符,不能用做标号。 13:42:57
标号:指令助记符 目的操作数,源操作数 ;注释 标号:指令助记符 目的操作数,源操作数 ;注释 2、指令助记符 指令助记符也叫做操作码,是指令名称的代表符号, 是一条指令语句中必需的,表示本指令进行的操作。 例:MOV 表示传送 MOV A,#13H ADD A, #0AAH 3、操作数 操作数是指令参与操作的数据,有些指令不需要操作 数,只有操作码;有些指令需要2个或3个操作数。 在数据传送时,送出数据的叫做源操作数,接收数据 的叫做目的操作数。指令中,目的操作数写在前,源 操作数写在后,两操作数之间用逗号“,”分开。有些 操作数可以用表达式表示。 可以用不同的寻址方式得到操作数。 NOP CLR A CJNE A, direct, rel 13:42:57
标号:指令助记符 目的操作数,源操作数 ;注释 4.2.1 汇编语言的一般格式 标号:指令助记符 目的操作数,源操作数 ;注释 4、注释 注释是为了阅读程序方便由编程人员加上的,并不 影响程序的执行和功能,所以,注释部分不是必需 的。 注释部分必须用分号“;”开头,一般都写在它所注 释的指令的后面,注释本身只用于对指令功能加以 说明,使阅读程序时便于理解,所以注释可以用中 文或者英文甚至任何便于理解的字符表示。 13:42:57
A(地址为E0H)、B地址,见表3-2特殊功能寄存器(49页) 4.2.2 指令代码的存储格式 指令存储位置:程序存储器 指令由操作码和操作数组成,不同的指令所需要的操 作数的个数有可能是不同的,所以每条指令的实际字 节数不是固定的, 例如,程序中有如下两条连续存放的指令: MOV A,#68H ;将立即数68H送到累加器A中; 是两字节指令; 机器码:74H(操作码)和68H(操作数). MOV B, #73H ;将立即数73H送到寄存器B中; 是三字节指令; 机器码: 75H(操作码)、F0H和73H; B(地址为F0H) 和73H是操作数。 A(地址为E0H)、B地址,见表3-2特殊功能寄存器(49页) 13:42:58
指令存放格式 指令在存储器中以二进制数形式、以字节为单位按照地址递增的顺序存放。 从低地址开始,先存放操作码,然后是操作数。 “MOV A, #68H”, “MOV B, #73H” 地址 指令 … 1000H 74H 1001H 68H 1002H 75H 1003H F0H 1004H 73H 假设这两条指令存放起始地址是1000H, 则存放的格式为: 左边一列表示的是程序存储器的地址 右边一列是存放在该地址单元中的二 进制指令。 13:42:58
程序执行过程 程序执行时是依次逐条取出指令执行的。 单片机内有一程序计数器PC, 指向要执行的程序指令 代码存放的地址, 具有自动加一特点,因而指令被逐字 节取出, 然后译码执行。 首先取操作码74H,经译码得知这是一条两字节指令, 其操作是将立即数送到累加器A中,而操作数是以立 即数形式放在操作码的下一地址中,程序计数器自动 加一,将下一地址中数据68H取出来,送到累加器A 中。 地址 指令 1000H 74H 1001H 68H 1002H 75H 1003H F0H 1004H 73H … 13:42:58
程序执行过程 程序计数器PC再次自动加一, 指向下一条指令第一个 字节,取出75H, 经译码知这是一条三字节指令, 其操作 是将一立即数送到寄存器B中, B用该指令第二个字节F0H来表示, F0H是寄存器B的地 址, 该指令第三个字节内容就是要传送的立即数73H。 地址 指令 1000H 74H 1001H 68H 1002H 75H 1003H F0H 1004H 73H … 这样随着程序计数器逐次加 一, 指令被一个字节一个字 节地取出、译码和执行。 13:42:58
4.2.3 指令中的符号约定 在描述单片机指令系统时,经常使用各种缩写符号: 各种符号及含义如表4-1所示。 4.2.3 指令中的符号约定 在描述单片机指令系统时,经常使用各种缩写符号: 各种符号及含义如表4-1所示。 A: 累加器ACC(与A物理上相同, 分别用于不同寻址方式) B: 寄存器B CY: 进(借)位标志位, 在位操作指令中作为累加器使用 addr8(direct):直接地址, 代表8位内部RAM地址。SFR可用名字 bit: 位地址, 内部RAM中的可寻址位和SFR中的寻址位。 #data8: 8位常数(8位立即数), 取值范围#00H~#0FFH。 #data16:16位常数(16位立即数), 取值#0000H~#0FFFFH。 @: 间接寻址, @Ri: 寄存器间接寻址, i=0, 1。 @DPTR 13:42:58
4.2.3 指令中的符号约定 表4-1 rel: 8位带符号地址偏移量, -128~+127(补码)。常用符号表示, 偏移量在汇编时由程序计算。 Rn: 当前工作区(0~3区)的工作寄存器(n=0,1,…,7)。 Ri: 可作地址寄存器的工作寄存器R0和R1(i=0, 1)。 X: X寄存器内容。 (X): 由X寄存器寻址的存储单元的内容。 →:表示数据的传送方向。 / :表示对该位操作数取反,如:/bit。 ∧: 表示逻辑与 ∨: 表示逻辑或 ⊕: 表示逻辑异或 13:42:58
§4.3寻址方式 指令中寻找操作数的方式,称为寻址方式。 STC15F2K60S2单片机共有7种寻址方式 立即数寻址 寄存器寻址 直接寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址 13:42:58
1、立即数寻址 指令中,操作所需要操作数就在指令中,是指令的组成 部分,CPU在得到指令的同时也立即得到了操作数。 例如: M0V A,#28H ; 功能:将立即数28H送入累加器A中。指令执行后, A中为28H,A中原来数据被覆盖,记作:A←28H 源操作数是立即数28H, 目的操作数是累加器A。 指令的机器码为两个字节:74H,28H。 注意:因累加器A是8位的,立即数只能是8位的, 且只能是整数, 不能是小数、变量或其他类型数据。 立即数只能作为源操作数,且位数要与目的操作数一致。 #号表示其后所跟的数据是立即数而不是直接地址。 13:42:58
1、立即数寻址 MOV A, #28H (机器码74H,28H)执行过程示意图 执行顺序 程序存储器 地址 0100H 74H 0101H 28H 0102H ←操作码 加1 PC ←操作数 ← 下一条指令操作码 28H 累加器A 图4-1 MOV A,#28H 执行过程示意图 13:42:58
1、立即数寻址 立即数寻址方式优点 采用立即数寻址方式的指令主要用来对寄存 器或存储器赋值。因为操作数可以从指令中直 接取得,不需要再到其他地方去寻找操作数, 所以,立即数寻址方式的指令执行速度很快。 13:42:58
2、寄存器寻址 指令所用操作数在CPU的内部寄存器中, 指令中操作数 用寄存器名(A, R0~R7, B, DPTR)表示。一条指令中, 源 操作数和目的操作数, 都可采用寄存器寻址方式。 寄存器地址隐含在指令码中(也是隐含寻址方式)。 例如: MOV A, #45H ;A←立即数45H(机器码: 74H 45H) 其中,源操作数45H为立即寻址方式,目的操作数为寄存器寻址方式。 INC R0 ;R0 ←R0+1 (机器码: 08H) 该指令只有一个操作数,为寄存器寻址方式。 13:42:58
2、寄存器寻址 MOV A, R1 ;A←R1 源操作数为寄存器R1,目的操作数为A,两者都是 寄存器寻址方式。 在寄存器寻址方式中,操作数用寄存器表示时有两 种含义 寄存器用于表示目的操作数时,是寄存器名,表示 是某个寄存器,用于接收数据; 寄存器用于表示源操作数时,是表示该寄存器中的 数据。 13:42:58
其中,R5所在的内部 RAM单元地址与寄存器组的选择有关。 2. 寄存器寻址 INC Rn ; 机器码08H~0FH(00001rrrB) 例: INC R5 ;指令机器码为0DH (00001101B) ;把寄存器R5的内容加1后再送回R5 该指令的执行过程如图所示。 其中,R5所在的内部 RAM单元地址与寄存器组的选择有关。 RAM单元地址 寻址 寄存器R5 指令机器码0DH 0 0 1 05H 1 0 15H 图4-2 INC R5指令执行过程示意图 程序状态字(PSW) (41页,45页) 13:42:58
2、寄存器寻址 MOV A, R1 寄存器寻址方式优点 采用寄存器寻址方式的指令在执行时,操作数就在寄 存器中,对该操作数的存取操作在CPU内部进行,不 需使用总线周期读存储器,所以执行速度很快。 注意 数据传送之后, 源操作数中数据并不消失, 仍然存在。 例如, 用寄存器作源操作数时,数据传送出之后寄存器 中的内容仍然存在, 只有作为目的操作数的寄存器被写入数据后,原来的 数值会被新写入的数据所取代。这种性质,对于存储 器也是同样的。 13:42:58
3、直接寻址 指令的操作数在存储器中时,指令中给出的是该操作 数所在存储器的地址。 优点 直接寻址方式对存储器进行访问时最简单、最直接。 例如: MOV A, 45H 功能:将地址为45H的存储器单元中的内容取到A中。 源操作数寻址方式是直接寻址, 表示要送出的数据在直 接地址45H中;目的操作数寻址方式是寄存器寻址。 机器码: E5H, 45H, 其中, E5H是操作码, 45H是操作数。 13:42:58
MOV A, 45H (机器码E5H, 45H)执行过程 设机器码放在程序存储器地址0100H和 0101H两单元中, 指令执行前, 数据存储器的45H中的数据为34H, 则执行 后A=34H,将A中原来的数据覆盖。 执行顺序 程序存储器 地址 内部数据存储器RAM 地址 0100H E5H 0101H 45H 0102H 45H 34H 46H ←操作码 ←操作数 ← 下一条指令操作码 34H 累加器A 图4-3 MOV A, 45H 执行过程示意图 13:42:58
图4-4 MOV A,@R0 (机器码E6H) 指令执行过程示意图 4、寄存器间接寻址(简称寄存器间址) 操作数所在存储单元的有效地址在指定的寄存器中,指 令中给出的是存放这个地址的寄存器。 用作寄存器间接寻址的寄存器有R0, R1,数据指针DPTR。 使用间接寻址的标志是在寄存器前面加一个“@”号,以 区别于寄存器寻址。 MOV A, @R0 MOV A,@R0 (机器码E6H) 内部数据存储器RAM 地址 执行顺序 程序存储器 地址 31H 51H 32H 0100H E6H 0101H 0102H 31H R0 ← ←操作码 ← 下一条指令操作码 51H 累加器A 图4-4 MOV A,@R0 (机器码E6H) 指令执行过程示意图 13:42:58
操作数地址=偏移量(A内容) +变址基值。 1. PC作基地址加上A的内容形成操作数地址A+PC。 5.变址寻址 指令中指定存放变址基值的变基址寄存器 变址寄存器 操作数地址=偏移量(A内容) +变址基值。 1. PC作基地址加上A的内容形成操作数地址A+PC。 2. DPTR作基地址加上A内容形成操作数地址A+DPTR。 两种寻址方式: 例: MOVC A, @A+PC, 指令操作码助记符MOVC表示从程 序存储器取数据, PC内容指向下一地址作为基地址, 加上A 中数据就构成了所要取数的地址。 例: …………… 0100 7402 MOV A, #02 0102 83 MOVC A, @A+PC 0103 00 NOP 0104 00 NOP 0105 64 DB 64H ……… 到MOVC A, @A+PC时, A=2,PC=0103H,因此, A+PC=0105H, @A+PC表示把0105H作 为地址, 从这个地址指向 的单元中取数据送到A中, 所以结果就是把0105H中 的数据64H送到了A中。 地址 机器码 汇编程序 PC 13:42:58
5、变址寻址 例如:MOVC A, @A+DPTR,DPTR的内容加上A中 的数据就构成了所要取数的地址。 例: …………… MOV A, #02H ;A=2 MOV DPTR, #TABLE ; DPTR=TABLE MOVC A, @A+DPTR ; A+DPTR =TABLE+2 ……… TABLE: DB 30H DB 31H DB 32H 数字0, 1, 2…的ASCII码值(附录A) TABLE+2 →A, A=32H 变址寻址优点: 适于访问固化在程序存储器中常数表格,以完成查表功能, 如不同码制之间数据转换等。因DPTR可用指令赋值, MOVC A, @A+DPTR寻址使用更广泛。 13:42:58
6、相对寻址 功能: 该寻址方式主要用于相对跳转指令。 功能: 该寻址方式主要用于相对跳转指令。 寻址方法: 把指令中给定的地址偏移量与本下一条指 令所在单元地址(即程序计数器PC中的内容)相加,即 得到真正的程序转移地址。 现行的PC 与变址方式区别 该偏移量有正、负号, 在机器指令中必须以补码形式给 出, 所转移范围为相对于当前PC值的-128~+127之间。 例: JC 80H (机器码40H 80H) 若C=0,则PC值不变,若C=1,则以现行的PC为基地 址加上80H(补码,即数值-80H=-128D)得到转向地址。 PC内容指向下一指令地址 13:42:58
若转移指令放在1005H,该指令的执行过程如图所示。 注意, 偏移量以补码给出,所以80H代表着-80H =-128D 。 6、相对寻址 —— JC 80H (机器码40H 80H)执行过程 若转移指令放在1005H,该指令的执行过程如图所示。 注意, 偏移量以补码给出,所以80H代表着-80H =-128D 。 程序存储器 地址 PC→ PC+1→ PC+2→ 0F87H 1005H 0100 0000 1006H 1000 0000 1007H 新PC→ 即跳转的地址 符号扩展FF80H+1007H=0F87H 操作码 偏移量 现行的PC 下一指令地址 图4-5 JC 80H执行示意图 13:42:58
7、位寻址 位操作指令能对位地址空间每一位进行运算和传送操作。 例如:MOV C, P1.0 ;将P1.0的状态传送到C SETB 20H.6 ;将20H单元的D6位置为1 CLR 25H ;将25H位的内容清零 综上所述,指令的寻址方式就是寻找操作数或寻找操作 数的地址的方式。 寻址方式与存储器的结构有关。例如,访问程序存储器 只能用变址寻址的方式;访问特殊功能寄存器只能用直 接寻址(位寻址)方式;访问外部数据存储器只能用寄存 器间接寻址方式等。 一般来说,寻址方式越多,计算机功能越强,灵活性越 大。所以寻址方式对机器的性能有重大影响。 13:42:58
§4.4 数据传送类指令(29条) 数据传送类指令是使用频率最高的一类指令。 功能:主要用来给单片机的内部和外部资源赋值、 进行堆栈的存取操作等。数据传送类指令执行前后, 对程序状态字PSW一般不产生影响。 (注: A为目的操作数时, 影响PSW的奇偶标志位P。) 分类:根据操作方式不同, 数据传送类指令分为三 种: 数据传送(22条) 数据交换(5条) 栈操作(2条) 13:42:58
4.4.1 数据传送指令(22条) 1、MOV指令(16条) 2、MOVX指令(4条) 3、MOVC指令 (2条) 1、MOV指令 4.4.1 数据传送指令(22条) 1、MOV指令(16条) 2、MOVX指令(4条) 3、MOVC指令 (2条) 1、MOV指令 MOV指令作用区间: 内部数据存储器和特殊功能寄存器 使用方法 利用Rn可直接访问某工作寄存器; 利用@Ri可间接寻址内部数据RAM的某一字节单元; 直接寻址则可遍访问内部数据RAM(00H~7FH)和特殊 功能寄存器空间。 13:42:58
(注: A为目的操作数时, 影响PSW的奇偶标志位P。) 1、MOV指令(16条) 对双操作数的数据传送指令允许在工作寄存器、内 部数据RAM、累加器A和特殊功能寄存器(SFR)任意 两个之间传送一个字节的数据,而且立即操作数能 送入上述任何单元中。 利用MOV指令还可以把16bit的立即数直接送入数据 指针DPTR中。 格式:MOV 目的字节, 源字节 功能:把源操作数指定的字节变量传送到目的操作数 指定的单元中,源字节内容不变。MOV指令一般不 影响别的寄存器或标志。 (注: A为目的操作数时, 影响PSW的奇偶标志位P。) 13:42:58
(1) 立即数送累加器A和Rn、内部RAM、SFR MOV A, #data8 ;A← #data8 MOV addr8,#data8 ;(addr8)← #data8 MOV @Ri, #data8 ;(Ri)← #data8 direct: addr8 MOV Rn, #data8 ;Rn← #data8 @是间接寻址, (Ri)表示由Ri(i=0,1)寄存器值所指出RAM单元。 例: MOV R0, #60H ;将立即数60H送到寄存器R0中 MOV @R0, #56H ;将56H送到R0间接寻址的单元(地址60H)中 用直接寻址(direct或addr8)可把立即数送入低128字节 内部RAM任意单元或任一特殊功能寄存器: 例: MOV 20H, #56H ;将立即数56H送入20H单元中 MOV P1, #80H ;把80H直接送入P1口(口地址为90H)中 直接寻址 13:42:58
(2)Rn、内部RAM、SFR与累加器A传送数据。 1、MOV指令(16条) (2)Rn、内部RAM、SFR与累加器A传送数据。 有6条指令: MOV A, addr8 ;A←(addr8) MOV A, @Ri ;A← (Ri) MOV A, Rn ;A← Rn MOV addr8, A ;(addr8)← A MOV @Ri, A ;(Ri)← A MOV Rn, A ;Rn←A 13:42:58
(2)Rn、内部RAM、SFR与累加器A传送数据 间接寻址@Ri是以Ri的内容作为地址进行寻址, 由于Ri 为8位寄存器, 所以其寻址范围可为00H~FFH。例如: MOV R1, #82H MOV A, @R1 上述指令对STC12C5A60S2单片机而言, 其功能是将内 部RAM地址82H单元中内容送到A中。内部80H~FFH 的RAM单元, 只能用这种间接寻址方式进行访问。 欲从DPL取数到累加器A,用直接寻址方式: MOV A, 82H;执行后A的值是DPL(地址为82H)中的值 也可使用下面指令 MOV A, DPL 特殊功能寄存器只能直接寻址或位寻址 13:42:58
1、MOV指令(16条) (3)Rn、SFR和内部数据RAM之间的数据传送。 有5条指令: MOV addr8, addr8 ;(addr8目)←(addr8源) MOV addr8, @Ri ;(addr8)←(Ri) MOV addr8, Rn ;(addr8)←Rn MOV @Ri, addr8 ;(Ri)←(addr8) MOV Rn, addr8 ;Rn←(addr8) 例: MOV 60H, 50H ; 把50H单元内容送到60H单元 13:42:58
1、MOV指令(16条) 例, 若设PSW中标志位RS1, RS0为“01”, 则R0~R7 选中第1组(有四组: 0,1,2,3)工作寄存器区(08H~0FFH), 此时, “MOV 40H, R0” 与 “MOV 40H, 08H” 是等价的。 例如,用立即寻址指令可直接给内部RAM中30H和 P1口上置数(注:这里书中举例应属于(1) ): MOV 30H, #25H MOV P1, #0CAH 执行后:(30H)=25H,(P1)=0CAH。 13:42:58
功能:把16位常数装入数据指针DPTR 。只有 一条指令: 1、MOV指令(16条) (4)目标地址传送(1条) 功能:把16位常数装入数据指针DPTR 。只有 一条指令: MOV DPTR , #data16 例如: MOV DPTR , #0150H 表示把16位常数装入数据指针。执行后, DPTR=0150H,其中DPH=01H,DPL=50H 13:42:58
2、MOVX指令(4条) 功能: 用于累加器A和外部RAM或扩展并行I/O口进行数 据传送。这种传送只一种寻址方式, 即寄存器间接寻址。 两种寄存器用于间接寻址 用R1或R0进行寄存器间接寻址。该方式能访问外部 数据存储器(或扩展并行I/O口)256个字节中一个字节。 若要访问更大的空间,需使用P2口输出高8位地址。 需先给P2和Ri赋值,然后执行MOVX指令。 用16位的数据存储器地址指针DPTR进行寄存器间接 寻址。这种方法能遍访64KB的外部数据存储器(或扩 展并行I/O口)的任何单元。 13:42:58
2、MOVX指令(4条) 指令格式:MOVX 目的字节, 源字节 有4条指令 (A与外部RAM或I/O口进行数据传送) MOVX A, @DPTR ;A←(DPTR) MOVX A, @Ri ;A←(Ri) MOVX @DPTR, A ;(DPTR)←A MOVX @Ri, A ;(Ri)←A 注意:由于使用R1或R0寄存器间接寻址方式访问外 部数据存储器时,寻址范围受到256字节限制,因此, 在实际应用中,一般使用DPTR寄存器间接寻址方式 访问外部数据存储器。 13:42:58
例如:若外部数据存储器单元中: (0100H)=60H,(0101H)=2FH 2、MOVX指令(4条) 例如:若外部数据存储器单元中: (0100H)=60H,(0101H)=2FH 则执行: MOV DPTR , #0100H MOVX A, @DPTR ;执行后,累加器A=60H 13:42:58
3、程序存储器向累加器A传送指令——MOVC 查表:单片机提供2条查表指令,访问程序存储器。 指令采用变址寻址, 以PC或DPTR为基址寄存器, 以累 加器A为变址寄存器, 基址寄存器与变址寄存器内容相 加得到程序存储器某单元的地址值; MOVC指令把该存储单元的内容传送到累加器A中。 格式: MOVC A, @A+PC ;PC←PC+, A←(A+PC) MOVC A, @A+DPTR ;A←(A+DPTR) 功能: 把A中内容与基址寄存器(PC, DPTR)内容相加, 求得程序存储器单元地址, 再把该地址单元内容A。 指令执行后不改变基址寄存器内容, 因执行16位加法, 从低8位产生的进位将传送到高位去, 不影响任何标志。 13:42:58
3、程序存储器向累加器A传送指令——MOVC MOVC A , @A+PC MOVC A , @A+DPTR 这两条指令主要用于查表,即完成从程序存储器读取 数据的功能。 两条指令使用不同的基址寄存器, 使用范围也不同。 机器码:83H 机器码:93H 以PC为基址寄存器时,CPU在取出本指令后PC自动 加1,因为本指令为1字节指令,所以这时PC已不是 原值,而是PC+1的值。 因累加器中内容为8位无符号整数, 这使得本指令查表 范围只能在以PC当前值开始后的256字节范围内。 13:42:58
3、程序存储器向累加器A传送指令——MOVC MOVC A , @A+PC MOVC A , @A+DPTR 以DPTR作为基址寄存器时,由于DPTR的内容可赋 不同的值,使得该指令应用范围较为广泛,表格常 数可设置在64KB程序存储器的任何地址空间。 其缺点是,若DPTR已有它用,在赋表首地址之前 必须保护现场,执行完查表后再予以恢复。 13:42:58
3、程序存储器向累加器A传送指令——MOVC 【例4-1】 试编制根据累加器A中的数(0~9之间)查其平 方表的子程序。 解:程序代码如下: COUNT: PUSH DPH PUSH DPL ;保护DPTR内容 MOV DPTR , #TABLE ;赋表首址→DPTR MOVC A , @A+DPTR ;据A中内容查表 POP DPL POP DPH ;恢复DPTR原内容 RET ;返回 TABLE: DB 00, 01, 04, 09, 16, 25, 36, 49, 64, 81 13:42:58
4.4.2 数据交换指令 包括字节交换指令和半字节交换指令。 1、字节交换指令 XCH A, addr8 ;A←→(addr8) XCH A, @Ri ;A←→(Ri) XCH A, Rn ;A←→Rn 上述指令把累加器A中内容与第二操作数所指定的工作 寄存器、间接寻址或直接寻址的单元内容互相交换。 例如,设R0=20H,A=3FH,(20H)=75H, 执行指令 XCH A, @R0 ;执行结果A=75H,(20H)=3FH 13:42:58
4.4.2 数据交换指令 2、半字节交换指令 XCHD A, @Ri ;A3~0←→ (Ri) 3~0 4.4.2 数据交换指令 2、半字节交换指令 XCHD A, @Ri ;A3~0←→ (Ri) 3~0 指令把累加器A的低4位和寄存器间接寻址的内部RAM 单元的低4位交换, 高4位内容不变, 不影响标志位。 例如: 设A=69H (0110 1001),R1=30H,内部RAM中 30H的内容: (30H) =87H(1000 0111),指令 XCHD A, @R1 ; 执行结果:A=67H,(30H)=89H SWAP A ; A0~3 <=> A4~7(高低两半字节交换) 13:42:58
4.4.3 栈操作指令 栈的作用——保护断点, 保护现场 主程序调用子程序或中断处理过程时,分别要保存 返回地址即断点地址和保护现场,以便在返回时能 够回到调用前的程序段,继续运行原来的程序。 现场保护和恢复 保护现场:进入子程序或中断处理程序后要保护所 用到的通用寄存器的值。 恢复现场:子程序返回或中断处理返回前,还要能 够恢复这些寄存器的值 13:42:58
保护断点, 保护现场 保存返回地址的方法:将返回地址(断点地址)保存到堆 栈中(入栈或压栈), 返回主程序前从堆栈中取出上述 地址放回到指令计数器PC中(出栈或弹栈); 按照放回后的PC值, 从程序存储器中取指令执行就返 回到主程序被中断了的地方, 以继续执行主程序。 保护现场的方法: 将现场条件 (寄存器的值) 先推入 (PUSH) 堆栈保存, 然后再使用这些寄存器, 返回主 程序前, 使用POP指令恢复寄存器中的值。 13:42:58
堆栈区 位置:内部存储器的一部分区域专门用于堆栈 数据存取规则:后进先出(LIFO—Last In First Out), 即最后存入的数据将被最先取出。 堆栈指针SP:SP始终指向栈顶。 SP+1 入栈后 SP指向栈顶→ 出栈后 入栈操作:先SP+1→SP,指向栈顶的上一个空单元,然后把直接寻址单元的内容压入SP所指的单元中。 SP-1 出栈操作:先弹出栈顶内容到直接寻址单元,然后SP- 1→SP,形成新的堆栈指针。 图4-6 堆栈示意图 13:42:58
栈操作指令 PUSH addr8 ; SP←SP+1, (SP)←(addr8) POP addr8 ; (addr8)← (SP) , SP←SP- 1 分别完成两种堆栈操作: 入栈 (PUSH), 出栈(POP) 。 注意:PUSH指令和POP指令成对出现,并注意顺序。 例: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 …… ;执行其他程序 POP PSW ;恢复标志寄存器内容 POP ACC ;恢复累加器ACC中内容 该程序执行后,累加器ACC和PSW寄存器中的内容可得到保护和正确的恢复。 13:42:58
正确: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 …… ;执行其他程序 入栈出栈顺序错误会导致现场恢复错误 正确: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 …… ;执行其他程序 POP PSW ;恢复标志寄存器内容 POP ACC ;恢复累加器ACC中内容 若为: PUSH ACC PUSH PSW …… ;其他程序 POP ACC POP PSW 则执行后,将使得ACC和PSW中的内容互换。 出入栈规则:后进先出 13:42:58
保护断点, 保护现场 举例 假设长调用子程序 LCALL Delay (机器码: 12H, 11H, 00H)在1000H存储器单元,如图所示。 地址 程序存储器 PC→ 1000H 12H 1001H 11H 1002H 00H 1003H 1100H 0C0H 1101H 0D0H 1102H 1103H 0E0H 1104H 1105H 1106H 1107H 1108H 22H 1109H ① LCALL Delay 地址 内部RAM PC+1→ 07H R7 08H 09H 0AH 0BH PC+2→ (ACC)=70H SP→ 现行PC ③ ② (PSW)=80H SP+1→ 03H 即下一指令地址 保护断点 SP+2→ 10H 保护现场 ⑤ ⑤ 新PC→ SP+3→ Delay地址 80H PSW PUSH PSW ④ SP+4→ 70H ACC 即调用的地址 PUSH ACC ⑥ 保护现场 ⑥ 堆栈区 POP ACC 恢复现场 POP PSW 保护断点, 保护现场的执行过程示意图 RET 13:42:58
保护断点, 保护现场 举例 假设长调用子程序 LCALL Delay (机器码: 12H, 11H, 00H)在1000H存储器单元,如图所示。 地址 程序存储器 PC→ 1000H 12H 1001H 11H 1002H 00H 1003H 1100H 0C0H 1101H 0D0H 1102H 1103H 0E0H 1104H 1105H 1106H 1107H 1108H 22H 1109H ① LCALL Delay 地址 内部RAM PC+1→ 07H R7 08H 09H 0AH 0BH PC+2→ (ACC)=70H SP-4→ 恢复断点 ⑦ 现行PC ② (PSW)=80H SP-3→ 03H 即下一指令地址 保护断点 SP-2→ 10H 保护现场 ⑤ ⑦ 新PC→ SP-1→ Delay地址 80H PSW PUSH PSW ④ ⑥ SP→ 70H ACC 即调用的地址 PUSH ACC 恢复现场 保护现场 ⑥ 堆栈区 POP ACC 恢复现场 POP PSW ⑦ 返回 保护断点, 保护现场的执行过程示意图 RET 13:42:58
数据传送类操作注意事项: 除POP, MOV指令将数据送到PSW外, 传送操作一般 不影响标志位。向A传送数据时, 会影响PSW的P标志。 把源地址单元内容送到目的地址单元后,源地址单元 中的内容不变。 对特殊功能寄存器SFR操作必须用直接寻址(位寻址)。 对STC15F2K60S2单片机内部RAM的80H~FFH单元 只能使用@Ri间接寻址方式访问。 将累加器A压入堆栈或弹出堆栈时, 应用PUSH ACC 和POP ACC指令, 不能用PUSH A和POP A指令。 否则, 程序编译会出错。因累加器写成A或ACC在汇编语 言指令中有区别, 使用A, 表示使用寄存器寻址方式; 而 使用ACC时, 表示使用直接寻址方式。 13:42:58
§4.5逻辑操作类指令(24条) 逻辑操作类指令完成与、或、异或、清“0”、求反、左 右移位等逻辑操作,共有24条。 分类:单操作数和双操作数 单操作数: 专对累加器A进行的逻辑操作, 包括: 清“0”、 求反、左右移位等,操作结果保存在累加器A中。 双操作数: 累加器A或直接寻址单元作为第一操作数 和第二操作数之间的逻辑与、或和异或操作,结果保 存在A中或直接寻址单元中。第二操作数可以是立即 数、寄存器Rn、内部数据RAM单元或者SFR。 13:42:58
§4.5逻辑操作类指令(24条) ←A ←A ←A ←A ←A 功能 指令形式 执行结果 单操作数 清0 CLR A A←0 取反 CPL A 左移 RL A ←A 带进位左移 RLC A ←A 右移 RR A ←A 带进位右移 RRC A ←A 4位环移 SWAP A ←A 数据传送类指令(数据交换指令) 13:42:58
§4.5逻辑操作类指令(24条) 功能 指令形式 执行结果 双操作数 与(∧) ANL ORL A, XRL 或(∨) 异或(⊕) A←A∧X A←A∨X A←A⊕X X代表格式中第二操作数 #data addr8 @Ri Rn A #data ANL ORL addr8, XRL addr8←addr8∧Y addr8←addr8 ∨ Y addr8←addr8 ⊕ Y Y代表格式中第二操作数 13:42:58
§4.5逻辑操作类指令 4.5.1 对累加 器A进行的逻辑操作 对累加器A进行的逻辑操作包括清“0” 、求反和移位: 1、累加器A清“0” CLR A ;A←0,把00H送入累加器A中 2、累加器A求反 CPL A ;A← ,把累加器内容按位求反后送入累加器A中 例如,设累加器A原来内容为67H 执行“CLR A”后将变成00H,再执行“CPL A”后将变为 0FFH 13:42:58
3、累加器A左右移位 RL A ;累加器左循环移位 RLC A ;累加器通过CY左循环移位 RR A ;累加器右循环移位 RRC A ;累加器通过CY右循环移位 SWAP A ; 累加器高低半字节互换 左移一位相当于乘以2,右移一位相当于除以2 例 MOV A ,#01H ;A←01H RL A ;A←02H RL A ;A←04H RL A ; A←08H 若继续执行下面指令: RR A ;A←04H RR A ;A←02H RR A ;A←01H,累加器内容又变为1。 通过进位标志CY的移位可用于检查一个字节中各位的状态或 用于逐位输出的情况,也可构成多个字节的移位操作。 13:42:58
3、累加器A左右移位 【例4-2】 在40H和41H中存放一个双字节数据(即16位数据), 高位字节数据在41H中, 低位字节数据在40H中,试将其除以2。 解: 利用循环右移指令可以将一个字节的数据除以2。如果将双字节数据除以2,可以考虑使用带进位标志CY的循环右移指令。程序代码如下: CLR C ;先将进位标志清零, 为第一次移位做准备 MOV A, 41H RRC A MOV 41H, A ;高位字节 MOV A, 40H MOV 40H, A 假设(41H)= 01H, (40H)= 02H :→258 A (41H) 01H D0→ 00H 02H A (40H) D0(41H) 81H 0081H:→129 13:42:58
3、累加器A左右移位 指令SWAP交换A中低和高半字节(位3~0和位7~4), 也看作是一个4位循环移位指令, 不影响标志。 例如: MOV A, #0A5H SWAP A ;执行结果 A=5AH 13:42:58
4.5.2 双操作数逻辑操作指令 双操作数的逻辑操作主要包括:直接地址单元(目的)与 累加器A、立即数之间, 以及累加器A(目的)与立即数、 内部存储器之间的逻辑操作。 逻辑操作是按位进行的。 “ANL”指令常用来屏蔽字节中的某些位, 与0则该位清0,与 1保留该位不变; “ORL”指令常用来使字节中的某些位置1, 或1则该位置1,或0保留该位不变; “XRL”指令用来对字节中某些位取反, 异或1则该位取反,异或0保留该位不变 ANL ORL addr8, XRL ANL ORL A, XRL 13:42:58
4.5.2 双操作数逻辑操作指令 1、累加器A (目的)与立即数、内部存储器之间的按位逻 辑操作: ANL(ORL, XRL) A, 4.5.2 双操作数逻辑操作指令 1、累加器A (目的)与立即数、内部存储器之间的按位逻 辑操作: ANL(ORL, XRL) A, 逻辑与、或、异或的定义分别如下所示: 与:A∧B代码组合 0×1=1×0=0×0=0 ;有0即0 1×1=1 ;全1为1 或:A∨B代码组合1+0=0+1=1+1=1 ;有1即1 0+0=0 ;全0为0 异或:A⊕B代码组合 0⊕1=1⊕0=1 ;相异为1 0⊕0=1⊕1=0 ;相同为0 13:42:58
4.5.2 双操作数逻辑操作指令 例如,设A的内容为63H,R2为0AAH,分别执行命 令(ANL、ORL、XRL)后,结果如下: ANL A, R2 ;结果A=22H ORL A, R2 ;结果A=0EBH XRL A, R2 ;结果A=0C9H 0110 0011 ∧ 1010 1010 0010 0010 0110 0011 ∨ 1010 1010 1110 1011 0110 0011 ⊕ 1010 1010 1100 1001 A=22H A=0EBH A=0C9H 13:42:58
4.5.2 双操作数逻辑操作指令 2、直接地址单元(内部低128字节RAM、SFR为目的)与 累加器A、立即数之间的按位逻辑操作 ANL(ORL,XRL) addr8, A ANL(ORL,XRL) addr8, #data8 上述指令完成内部低128字节数据RAM或SFR中直接 寻址单元与累加器A、立即数之间的逻辑与(或,异或) 操作,执行结果送回内部数据RAM或SFR中。 13:42:58
4.5.2 双操作数逻辑操作指令 例如,设50H单元的内容为0AAH, A中内容为15H, 则 分别执行下面指令时的结果如下: 4.5.2 双操作数逻辑操作指令 例如,设50H单元的内容为0AAH, A中内容为15H, 则 分别执行下面指令时的结果如下: ANL 50H, #0F0H ; (50H)∧0F0H=0AAH ∧0F0H ;结果(50H)=0A0H, 屏蔽50H单元的低4位(清零) ORL 50H, #0FH ; (50H)∨ 0F0H=0AAH ∨0FH ;结果(50H)= 0AFH,将50H单元的低4位置1 XRL 50H, A ;(50H)⊕(A),结果(50H)=0BFH 当用逻辑与、或、异或指令修改一个并行I/O口输出 内容时,则原始值将从该输出口的锁存器中读取,而 不是从该输出口的引脚上读取。 1010 1010 ⊕ 0001 0101 1011 1111 13:42:58
4.5.2 双操作数逻辑操作指令 【例4-3】 设两位用ASCII码表示的数分别保存在40H、 41H单元中, 编程把其转换成两位BCD数, 并以压缩形 式存入40H单元中。 解: 方法一: ANL 40H, #0FH ;40H的ASCⅡ码变成BCD码 MOV A, 41H ANL A, #0FH ;41H的ASCⅡ码变成BCD码 RL A ;左移4位 RL A ORL 40H, A ;结果存40H单元中 数字0~9的ASCII: 30H~39H 假设: (40H)=32H, (41H)=39H, (40H)=02H (A)=39H (A)=09H SWAP A 方法二 (A)=90H (92H)BCD (40H)=92H 13:42:58
§4.6算术运算类指令 该类指令主要完成加、减、乘、除四则运算,以及增量、 减量和二十进制调整操作。除增量、减量指令外,大多 数算术运算指令会影响到状态标志寄存器PSW。 表4-3 算术运算类指令对标志的影响 指令助记符 影响标志 备注 CY OV AC ADD(加) × “×”表示可置1或清“0”, “0”表示总清“0” ADDC(带进位加) SUBB(带借位减) MUL(乘) DIV(除) DA(二十进制调整) 13:42:58