Presentation is loading. Please wait.

Presentation is loading. Please wait.

第四章 指令系统及汇编语言程序设计.

Similar presentations


Presentation on theme: "第四章 指令系统及汇编语言程序设计."— Presentation transcript:

1 第四章 指令系统及汇编语言程序设计

2 网站: http://www.gxwmcu.com/
任课教师:刘忠国 山东大学课程中心网站: 网站: keil μvision软件下载及指导手册(Help→μvision Help) STC15系列单片机器件手册 页 (2015/6/29更新)

3 第四章 指令系统及汇编语言程序设计 本章学习目标 了解助记符、指令格式 掌握单片机寻址方式 掌握单片机指令系统
掌握单片机汇编语言程序设计及开发环境 11:58:07

4 第四章 指令系统及汇编语言程序设计语言 4.1 编程语言简介 4.2 指令和伪指令 4.3 汇编语言程序调试 4.4 利用STC-ISP工具将程序下载到单片机中验证程序 4.5各类指令详解 数据传送类指令 逻辑操作类指令 算术运算类指令 位操作指令 控制类转移指令 4.6 汇编语言程序设计 具体指令系统介绍 11:58:07

5 指令列表见附录E §4.5 各类指令详解(111条) 8个助记符 §4.5.1 数据传送类指令(29条)
数据传送类指令是使用频率最高的一类指令。 功能:主要用来给单片机的内部和外部资源赋值、进 行堆栈的存取操作等。数据传送类指令执行前后,对 程序状态字PSW一般不产生影响。 (注: A为目的操作数时, 影响PSW的奇偶标志位P。) 分类:根据操作方式不同, 数据传送类指令分为三种: 数据传送(22条) 数据交换(5条) 栈操作(2条) 例: MOV A, #13H 例:XCH A, addr8; A←→(addr8) PUSH addr8 ; SP←SP+1, (SP)←(addr8) POP addr8 ; (addr8)← (SP) , SP←SP- 1 11:58:07

6 §4.5.1 数据传送类指令(29条)----数据传送(22条)
指令列表见附录 E 数据传送(22条) 数据交换(5条) 栈操作(2条) 11:58:07

7 §4.5.1 数据传送类指令(29条)----数据传送(22条)
数据交换(5条) 栈操作(2条) 11:58:07

8 §4.5.1 数据传送类指令(29条) --栈操作(2条) --数据交换(5条)
数据传送(22条) 数据交换(5条) 栈操作(2条) SWAP A 也可分类到“对累加 器A进行的逻辑操作” 数据传送类指令共 8个助记符 11:58:07

9 4.5.1.1 数据传送指令(22条) 1、MOV指令(16条) 2、MOVX指令(4条) 3、MOVC指令 (2条) 1、MOV指令
数据传送指令(22条) 1、MOV指令(16条) 2、MOVX指令(4条) 3、MOVC指令 (2条) 1、MOV指令 MOV指令作用区间: 内部数据存储器和特殊功能寄存器 使用方法 利用Rn可直接访问某工作寄存器; 直接寻址则可遍访问内部数据RAM(00H~7FH)和特殊 功能寄存器空间。 11:58:07

10 1、MOV指令(16条) 附录 E指令列表按目的操作数分类
双操作数的数据传送指令允许在工作寄存器、内部数 据RAM、累加器A和特殊功能寄存器(SFR)任意两个 之间传送一个字节的数据,而且立即操作数能送入上 述任何单元中。 附录 E指令列表按目的操作数分类 (1) 立即数送累加器A和Rn、内部RAM、SFR送 (4条) (2)Rn、内部RAM、SFR与累加器A传送数据送 (6条) (3)Rn、SFR和内部数据RAM之间的数据传送送 (5条) (4)目标地址传送 (1条): MOV DPTR , #data16 11:58:07

11 (1) 立即数送累加器A和Rn、内部RAM、SFR
MOV A, #data8 ;A← #data8 MOV addr8,#data8 ;(addr8)← #data8 #data8 ;(Ri)← #data8 direct: addr8 MOV Rn, #data8 ;Rn← #data8 @是间接寻址, (Ri)表示由Ri(i=0,1)寄存器值所指出RAM单元。 例: MOV R0, #60H ;将立即数60H送到寄存器R0中 #56H ;将56H送到R0间接寻址的单元(地址60H)中 用直接寻址(direct或addr8)可把立即数送入低128字节 内部RAM任意单元或任一特殊功能寄存器: 例: MOV 20H, #56H ;将立即数56H送入20H单元中 MOV P1, #80H ;把80H直接送入P1口(口地址为90H)中 直接寻址 11:58:07

12 (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 11:58:07

13 (2)Rn、内部RAM、SFR与累加器A传送数据
由于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 特殊功能寄存器(见表3-2)只能直接寻址或位寻址 11:58:07

14 1、MOV指令(16条) (3)Rn、SFR和内部数据RAM之间的数据传送。 有5条指令: MOV addr8, addr8 ;(addr8目)←(addr8源) MOV ;(addr8)←(Ri) MOV addr8, Rn ;(addr8)←Rn addr8 ;(Ri)←(addr8) MOV Rn, addr8 ;Rn←(addr8) 例: MOV 60H, 50H ; 把50H单元内容送到60H单元 11:58:07

15 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 H, #25H MOV P1, #0CAH 执行后:(30H)=25H,(P1)=0CAH。 11:58:07

16 功能:把16位常数装入数据指针DPTR 。只有 一条指令:
1、MOV指令(16条) (4)目标地址传送(1条) 功能:把16位常数装入数据指针DPTR 。只有 一条指令: MOV DPTR , #data16 例如: MOV DPTR , #0150H 表示把16位常数装入数据指针。执行后, DPTR=0150H,其中DPH=01H,DPL=50H 11:58:07

17 2、MOVX指令(4条) 功能: 用于累加器A和外部RAM或扩展并行I/O口进行数 据传送。这种传送只一种寻址方式, 即寄存器间接寻址。
@Ri) 两种寄存器用于间接寻址 用R1或R0进行寄存器间接寻址。该方式能访问外部数 据存储器(或扩展并行I/O口)256个字节中一个字节。 若要访问更大片外空间, 需用P2口输出高8位地址。需 先给P2和Ri赋值, 然后执行MOVX指令。(访问片内扩 与P2口无关) 用16位数据存储器地址指针DPTR进行寄存器间接寻 址 : 该法能遍访64KB外部数据存储器 (或扩展并行I/O 口)的任何单元。 与 P2口无关) 11:58:07

18 2、MOVX指令(4条) 指令格式:MOVX 目的字节, 源字节 有4条指令 (A与外部RAM或I/O口进行数据传送)
MOVX ;A←(DPTR) MOVX ;A←(Ri) MOVX @DPTR, A ;(DPTR)←A MOVX @Ri, A ;(Ri)←A 注意:由于使用R1或R0寄存器间接寻址方式访问外 部数据存储器时,寻址范围受到256字节限制,因此, 在实际应用中,一般使用DPTR寄存器间接寻址方式 访问外部数据存储器。 11:58:07

19 例如:若外部数据存储器单元中: (0100H)=60H,(0101H)=2FH
2、MOVX指令(4条) 例如:若外部数据存储器单元中: (0100H)=60H,(0101H)=2FH 则下列程序执行后的结果: MOV DPTR , #0100H; DPTR = 0100H MOVX A, @DPTR ;执行后, 累加器A=60H MOV B, A ; B=A=60H, 不能MOVX B, @DPTR INC DPTR ; DPTR = 0101H MOVX A, @DPTR ;执行后, 累加器A=2FH 11:58:07

20 3、程序存储器向累加器A传送指令——MOVC
查表:单片机提供2条查表指令,访问程序存储器。 指令采用变址寻址, 以PC或DPTR为基址寄存器, 以累 加器A为变址寄存器, 基址寄存器与变址寄存器内容相 加得到程序存储器某单元的地址值; MOVC指令把该存储单元的内容传送到累加器A中。 格式: MOVC ;PC←PC+, A←(A+PC) MOVC ;A←(A+DPTR) 功能: 把A中内容与基址寄存器(PC, DPTR)内容相加, 求得程序存储器单元地址, 再把该地址单元内容A。 指令执行后不改变基址寄存器内容, 因执行16位加法, 从低8位产生的进位将传送到高位去, 不影响任何标志。 11:58:07

21 3、程序存储器向累加器A传送指令——MOVC
MOVC A MOVC A 这两条指令主要用于查表,即完成从程序存储器读取 数据的功能。 两条指令使用不同的基址寄存器, 使用范围也不同。 机器码:83H 机器码:93H 以PC为基址寄存器时,CPU在取出本指令后PC自动 加1,因为本指令为1字节指令,所以这时PC已不是 原值,而是PC+1的值。 因累加器中内容为8位无符号整数, 这使得本指令查表 范围只能在以PC当前值开始后的256字节范围内。 11:58:07

22 3、程序存储器向累加器A传送指令——MOVC
MOVC A MOVC A 以DPTR作为基址寄存器时,由于DPTR的内容可赋 不同的值,使得该指令应用范围较为广泛,表格常 数可设置在64KB程序存储器的任何地址空间。 其缺点是,若DPTR已有它用,在赋表首地址之前 必须保护现场,执行完查表后再予以恢复。 11:58:07

23 3、程序存储器向累加器A传送指令——MOVC
【例4-2】 试编制根据累加器A中的数(0~9之间)查其平 方表的子程序。 解:程序代码如下: COUNT: PUSH DPH PUSH DPL ;保护DPTR内容 MOV DPTR , #TABLE ;赋表首址→DPTR MOVC A ;据A中内容查表 POP DPL POP DPH ;恢复DPTR原内容 RET ;返回 TABLE: DB 00, 01, 04, 09, 16, 25, 36, 49, 64, 81 11:58:07

24 数据交换指令 (5条) 包括字节交换指令和半字节交换指令。 1、字节交换指令 (3条) XCH A, addr8 ;A←→(addr8) XCH ;A←→(Ri) XCH A, Rn ;A←→Rn 上述指令把累加器A中内容与第二操作数所指定的工作 寄存器、间接寻址或直接寻址的单元内容互相交换。 例如,设R0=20H,A=3FH,(20H)=75H, 执行指令 XCH A, @R0 ;执行结果A=75H,(20H)=3FH 11:58:07

25 4.5.1.2 数据交换指令 ←A 2、半字节交换指令 (2条) 只有寄存器间接寻址@Ri
数据交换指令 2、半字节交换指令 (2条) XCHD A, @Ri ;A3~0←→ (Ri) 3~0 指令把累加器A的低4位和寄存器间接寻址的内部RAM 单元的低4位交换, 高4位内容不变, 不影响标志位。 例如: 设A=69H ( ),R1=30H,内部RAM中 30H的内容: (30H) =87H( ),指令 XCHD A, @R1 ;只有寄存器间接寻址 ; 执行结果:A=67H,(30H)=89H SWAP A ; A0~3 <=> A4~7(高低两半字节交换) ←A 11:58:07

26 4.5.1.3 栈操作指令 (2条) 栈的作用——保护断点, 保护现场
栈操作指令 (2条) 栈的作用——保护断点, 保护现场 主程序调用子程序或中断处理过程时,分别要保存 返回地址即断点地址和保护现场,以便在返回时能 够回到调用前的程序段,继续运行原来的程序。 例:LCALL COUNT ;表示调用COUNT子程序 MOV A, #23H 现场保护和恢复 保护现场:进入子程序或中断处理程序后要保护所 用到的通用寄存器的值。 恢复现场:子程序返回或中断处理返回前,还要能 够恢复这些寄存器的值 11:58:07

27 保护断点, 保护现场 保存返回地址的方法:将返回地址(断点地址)保存到堆 栈中(入栈或压栈), 返回主程序前从堆栈中取出上述 地址放回到指令计数器PC中(出栈或弹栈); 按照放回后的PC值, 从程序存储器中取指令执行就返 回到主程序被中断了的地方, 以继续执行主程序。 保护现场的方法: 将现场条件 (寄存器的值) 先推入 (PUSH) 堆栈保存, 然后再使用这些寄存器, 返回主 程序前, 使用POP指令恢复寄存器中的值。 11:58:07

28 堆栈区 位置:内部存储器的一部分区域专门用于堆栈
数据存取规则:后进先出(LIFO—Last In First Out), 即最后存入的数据将被最先取出。 堆栈指针SP:SP始终指向栈顶。 SP+1 入栈后 SP指向栈顶→ D 出栈后 入栈操作:先SP+1→SP,指向栈顶的上一个空单元,然后把直接寻址单元的内容压入SP所指的单元中。 SP-1 出栈操作:先弹出栈顶内容到直接寻址单元,然后SP- 1→SP,形成新的堆栈指针。 图4-36 堆栈示意图 11:58:07

29 栈操作指令 (2条) 只能直接寻址 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寄存器中的内容可得到保护和正确的恢复。 11:58:07

30 正确: 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中的内容互换。 出入栈规则:后进先出 11:58:07

31 保护断点, 保护现场 举例 假设长调用指令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 设执行delay前 PC+2→ SP→ (PSW)=80H 现行PC SP+1→ 03H (ACC)=70H 即下一指令地址 保护断点 SP+2→ 10H 保护现场 被调用子程 新PC← SP+3→ Delay地址 80H PSW PUSH PSW SP+4→ 70H ACC PUSH ACC 保护现场 省略程序 堆栈区 POP ACC 恢复现场 POP PSW 保护断点, 保护现场的执行过程示意图 RET 11:58:08

32 ⑥ ⑦ 堆栈区 ⑦ 保护断点, 保护现场 举例 返回PC
保护断点, 保护现场 举例 假设长调用指令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 设执行delay前 PC+2→ SP-4→ (PSW)=80H 恢复断点 现行PC 返回PC SP-3→ 03H (ACC)=70H 即下一指令地址 保护断点 SP-2→ 10H 保护现场 被调用子程 新PC→ SP-1→ Delay地址 80H PSW PUSH PSW SP→ 70H ACC PUSH ACC 恢复现场 保护现场 省略程序 堆栈区 POP ACC 恢复现场 POP PSW 返回 保护断点, 保护现场的执行过程示意图 RET 11:58:08

33 数据传送类操作注意事项: 除POP, MOV指令将数据送到PSW外, 传送操作一般 不影响标志位。向A传送数据时, 会影响PSW的P标志。
把源地址单元内容送到目的地址单元后,源地址单元 中的内容不变。 对特殊功能寄存器SFR操作必须用直接寻址(位寻址)。 对STC15F2K60S2单片机内部RAM的80H~FFH单元 将累加器A压入堆栈或弹出堆栈时, 应用PUSH ACC 和POP ACC指令, 不能用PUSH A和POP A指令。 否则, 程序编译会出错。因累加器写成A或ACC在汇编语 言指令中有区别, 使用A, 表示使用寄存器寻址方式; 而 使用ACC时, 表示使用直接寻址方式。 11:58:08

34 CLR A; CPL A; RL(C) A; RR(C) A
§4.5.2逻辑操作类指令(24条) 9个助记符 逻辑操作类指令完成与、或、异或、清“0”、求反、左 右移位等逻辑操作,共有24条。 分类:单操作数和双操作数 单操作数: 专对累加器A进行的逻辑操作, 包括: 清“0”、 求反、左右移位等,操作结果保存在累加器A中。 双操作数: 累加器A或直接寻址单元作为第一操作数 和第二操作数之间的逻辑与、或和异或操作,结果保 存在A中或直接寻址单元中。第二操作数可以是立即 数、寄存器Rn、内部数据RAM单元或者SFR。 CLR A; CPL A; RL(C) A; RR(C) A 11:58:08

35 9个助记符 §4.5.2逻辑操作类指令(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 数据传送类指令(数据交换指令) 11:58:08

36 9个助记符 §4.5.2逻辑操作类指令(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代表格式中第二操作数 11:58:08

37 9个助记符 §4.5.2逻辑操作类指令(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代表格式中第二操作数 11:58:08

38 9个助记符 §4.5.2逻辑操作类指令(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代表格式中第二操作数 数据传送类指令(数据交换指令) 11:58:08

39 §4.5.2逻辑操作类指令 4.5.2.1 对累加 器A进行的逻辑操作 对累加器A进行的逻辑操作包括清“0” 、求反和移位:
CLR A ;A←0,把00H送入累加器A中 2、累加器A求反 CPL A ;A← ,把累加器内容按位求反后送入累加器A中 例如,设累加器A原来内容为67H 执行“CLR A”后将变成00H,再执行“CPL A”后 将变为0FFH 11:58:08

40 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的移位可用于检查一个字节中各位的状态或 用于逐位输出的情况,也可构成多个字节的移位操作。 11:58:08

41 3、累加器A左右移位 【例4-3】 在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→ 1 00H 02H A (40H) D0(41H) 1 1 81H 0081H:→129 11:58:08

42 3、累加器A左右移位 例如: MOV A, #0A5H SWAP A ;执行结果 A=5AH
11:58:08

43 4.5.2.2 双操作数逻辑操作指令 双操作数的逻辑操作主要包括:直接地址单元(目的)与 累加器A、立即数之间,
双操作数逻辑操作指令 双操作数的逻辑操作主要包括:直接地址单元(目的)与 累加器A、立即数之间, 以及累加器A(目的)与立即数、 内部存储器之间的逻辑操作。 ANL ORL addr8, XRL 逻辑操作是按位进行的。 “ANL”指令常用来屏蔽字节中的某些位, “与” 0则该位清0,“与” 1保留该位不变; “ORL”指令常用来使字节中的某些位置1, “或” 1则该位置1, “或” 0保留该位不变; “XRL”指令用来对字节中某些位取反, “异或” 1则该位取反, “异或” 0保留该位不变 ANL ORL A, XRL 11:58:08

44 4.5.2.2 双操作数逻辑操作指令 1、累加器A (目的)与立即数、内部存储器之间的按位逻 辑操作: ANL(ORL, XRL) A,
双操作数逻辑操作指令 1、累加器A (目的)与立即数、内部存储器之间的按位逻 辑操作: ANL(ORL, XRL) A, 逻辑与、或、异或的定义分别如下所示: 与:A∧B代码组合 0×1=1×0=0×0=0 ;有0即0 1×1= ;全1为1 或:A∨B代码组合1+0=0+1=1+1= ;有1即1 0+0= ;全0为0 异或:A⊕B代码组合 0⊕1=1⊕0= ;相异为1 0⊕0=1⊕1= ;相同为0 11:58:08

45 双操作数逻辑操作指令 例如,设A的内容为63H,R2为0AAH,分别执行命 令(ANL、ORL、XRL)后,结果如下: ANL A, R ;结果A=22H ORL A, R ;结果A=0EBH XRL A, R ;结果A=0C9H A=22H A=0EBH A=0C9H 11:58:08

46 双操作数逻辑操作指令 2、直接地址单元(内部低128字节RAM、SFR为目的)与 累加器A、立即数之间的按位逻辑操作 ANL(ORL,XRL) addr8, A ANL(ORL,XRL) addr8, #data8 上述指令完成内部低128字节数据RAM或SFR中直接 寻址单元与累加器A、立即数之间的逻辑与(或, 异或) 操作,执行结果送回内部数据RAM或SFR中。 11:58:08

47 4.5.2.2 双操作数逻辑操作指令 例如,设50H单元的内容为0AAH, A中内容为15H, 则 分别执行下面指令时的结果如下:
双操作数逻辑操作指令 例如,设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 11:58:08

48 双操作数逻辑操作指令 当用逻辑与、或、异或指令修改一个并行I/O口输出 内容时,则原始值将从该输出口的锁存器中读取,而 不是从该输出口的引脚上读取。 例:若原(P0输出锁存器)=32H, (P0引脚状态)=0C2H, 则执行下面指令后(P0输出锁存器)=3FH , (P0引脚状态)=0C2H(不变)。 ORL P0, #0FH 运算输入是(P0输出锁存器)=32H 或80H 然而执行:ORL A, P0 运算输入是(P0引脚状态)=0C2H 若 (A)=0FH, 则执行上面指令后(P0输出锁存器)=32H (不变), (P0引脚状态)=0C2H (不变), (A)= 0CFH 。 11:58:08

49 双操作数逻辑操作指令 【例4-4】 设两位用ASCII码表示的数分别保存在40H、 41H单元中, 编程把其转换成两位BCD数, 并以压缩形 式存入40H单元中。 解: 方法一: ANL 40H, #0FH ;40H的ASCⅡ码变成BCD码 MOV A, 41H;便于屏蔽(41H) 高4位后与(40H)组合 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 用作BCD码(92H)BCD (40H)=92H 11:58:08

50 §4.5.3算术运算类指令 (24条) 8个助记符 该类指令主要完成加、减、乘、除四则运算,以及增量、 减量和二十进制调整操作。除增量、减量指令外,大多 数算术运算指令会影响到状态标志寄存器PSW。 表4-3 算术运算类指令对标志的影响 指令助记符 影响标志 备注 CY OV AC ADD(加) × “×”表示可置1或清“0”, “0”表示总清“0” 空表示不构成影响 ADDC(带进位加) SUBB(带借位减) MUL(乘) DIV(除) DA(二十进制调整) INC DEC 11:58:08

51 §4.5.3算术运算类指令 (24条) 8个助记符 该类指令主要完成加、减、乘、除四则运算,以及 增量、减量和二十进制调整操作。除增量、减量指 令外,大多数算术运算指令会影响到状态标志寄存 器PSW。 11:58:08

52 §4.5.3算术运算类指令 (24条) 8个助记符 该类指令主要完成加、减、乘、除四则运算,以及 增量、减量和二十进制调整操作。除增量、减量指 令外,大多数算术运算指令会影响到状态标志寄存 器PSW。 11:58:08

53 加减运算指令 (12条) 在加减运算指令中,以累加器A为第一操作数,并存放 操作后的结果。第二操作数可以是立即数、工作寄存 器、寄存器间接寻址字节或直接寻址字节。 运算结果会影响溢出标志OV、进位CY、辅助进位AC 和奇偶标志P。 1、加法指令:(4条) ADD A, #data8 ;A←A+#data8 ADD A, addr8 ;A←A+(addr8) ADD ;A←A+(Ri) ADD A, Rn ;A←A+Rn 把源字节变量与累加器相加, 结果保存在累加器中。 11:58:08

54 溢出标志OV取决于带符号数运算,和的第6、 7位中有一位产生进位而另一位不产生进位, 则使OV置1,否则OV被清0。OV=1产生溢出。
1、加法指令:(4条) 例如, MOV A, #0C3H ADD A, #0AAH 运算后,CY=1, OV=1, AC=0, A=6DH, PSW=85H 溢出标志OV取决于带符号数运算,和的第6、 7位中有一位产生进位而另一位不产生进位, 则使OV置1,否则OV被清0。OV=1产生溢出。 位号 D7 D6 D5 D4 D3 D2 D1 D0 符号 CY AC F0 RS1 RS0 OV F1 P 11:58:08

55 2、带进位加法指令 (4条) ADDC A, #data8 ;A←A+#data 8 +CY ADDC A, addr8 ;A←A+(addr8) +CY ADDC ;A←A+(Ri) +CY ADDC A, Rn ;A←A+Rn +CY 除了相加时把进位位也加上外,其他与一般加法指 令完全相同。 例, 设累加器A内容为0AAH, R0内容为55H, C内容为1, 执行指令: ADDC A, R0 运行结果: A= B, AC=1,CY=1,OV=0 11:58:09

56 2、带进位加法指令(4条) 低字节 高字节 【例4-5】设双字节加法中,被加数放20H、21H单元,加 数放30H、31H单元,和存放在40H、41H单元,若高字 节相加有进位则转OVER处执行。试编程实现之。 解:程序代码如下: (21H) (20H) +(31H) (30H) (41H) (40H) ADDM: MOV A, 20H ;取低字节被加数 ADD A, 30H ;低位字节相加 MOV 40H, A ;结果送40H单元 MOV A, 21H ;取高字节被加数 ADDC A, 31H ;加高字节和低位来的进位 MOV 41H, A ;结果送41H单元 JC OVER ;若有进位,则转OVER处执行 …… OVER: …… 11:58:09

57 3、带借位减指令(4条) SUBB A, #data8 ;A←A– #data8– CY SUBB A, addr8 ;A←A–(addr8) –CY SUBB ;A←A – (Ri) –CY SUBB A, Rn ;A←A – Rn –CY 在加法中,CY=1表示有进位,CY=0表示无进位; 在减法中,CY=1则表示有借位,CY=0表示无借位。 OV=1表示带符号数相减时, 从一个正数中减去一个负 数得出了一个负数(如3H-80H)或从一个负数中减去一 个正数时得出一个正数的错误情况(如80H-2H) 。 和加法类似, 该标志也是由运算时,差的第6、7位两者借 位状态经异或操作而得。 因减法只有带借位减一条指令, 所以在首次进行单字节 相减时, 须先清借位位CY, 以免相减后结果出错。 结果超出了符号数的表示范围 11:58:09

58 3、带借位减指令(4条) 例如,设累加器A的内容为D9H,R0的内容为87H, 求两者相减结果。 CLR C SUBB A, R0
执行结果:A=52H,CY=0,OV=0 若运算两数为无符号数,则其溢出与否和OV状态无 关,而靠CY是否为1予以判别,OV仅表明带符号数运 算时是否溢出。 若是带符号数 D9H -27H -79H - 87H 52H 11:58:09

59 3、带借位减指令(4条) 低字节 高字节 【例4-6】 两字节数相减, 设被减数放在20H、21H单元, 减数放在30H、31H单元, 差放在40H、41H单元。若 高字节相减有借位则转OVER处执行, 试编程实现之。 解:程序代码如下: SUBM: CLR C ;低字节减之前借位CY清0 MOV A, 20H ;被减数送A SUBB A, 30H ;低位字节相减 MOV 40H, A ;结果送40H单元 MOV A, 21H ;被减数高字节送A SUBB A, 31H ;高字节相减 MOV 41H, A ;结果送41H单元 JC OVER ;若有借位, 则转OVER处执行 …… OVER: …… (21H) (20H) - (31H) (30H) (41H) (40H) 11:58:09

60 4.5.3.2 乘除运算指令(2条) 乘除运算指令在累加器A 和寄存器B之间进行,运算 结果保存在累加器A和寄存器B中。
乘除运算指令(2条) 乘除运算指令在累加器A 和寄存器B之间进行,运算 结果保存在累加器A和寄存器B中。 1、乘法指令(1条) 乘法指令: MUL AB 把累加器A 和寄存器B中的8位无符号整数相乘; 16位乘积低字节在累加器A中,高字节在寄存器B中; 若乘积大于255 (0FFH), 则溢出标志位置 “1”, 否则清 “0”, 运算结果总使进位标志CY清“0” 。 乘法指令可以竖式表示: 11:58:09

61 1、乘法指令(1条) 例如,设A=82H(130),B=38H(56),执行指令: MUL AB
结果: 乘积为1C70H (7280), A=70H, B=1CH,OV=1, CY=0 若乘积大于255 (0FFH), 则溢出标志位置 “1”。 [例4-7] 用单字节乘法指令进行多字节乘法运算。设双字 节数低8位存放在30H, 高8位存放在31H单元, 单字节数 存放在40H单元, 编程实现双字节乘以单字节的运算, 乘 积按由低位到高位依次存放在50H, 51H, 52H单元中。 解:双字节数乘以单字节数, 设双字节数用X2X1表示, 单 字节数用Y表示, 则其乘法可表示为: ( X2·28+X1 )·Y=X2·Y·28+X1·Y (31H) (30H) × (40H) (52H)(51H)(50H) 最终结果在: 11:58:09

62 利用MUL指令分别进行X2·Y和X1·Y的乘法运算,然 后把等号右边两项移位相加即得其积。 可以使用下面的竖式表示:
( X2·28+X1 ) · Y=X2·Y·28+X1·Y 利用MUL指令分别进行X2·Y和X1·Y的乘法运算,然 后把等号右边两项移位相加即得其积。 可以使用下面的竖式表示: 其中, “(X1Y)低” 表示的是X1和Y乘积的低8位, 其他符号代表的含义类似。 RES0就是“(X1Y)低” , 即最后结果的最低位; RES1是“(X1Y)高 + (X2Y)低”(的结果; RES2是“(X2Y)高” 和由“(X1Y)高 + (X2Y)低” 产生的进位相加的结果。 11:58:09

63 [例4-7]程序代码 (X2·28+X1)·Y=X2·Y·28+X1·Y (31H) (30H)
(52H)(51H)(50H) →A MOV A, 30H MOV B, 40H MUL AB ;X1·Y MOV 50H, A ;积低字节存50H MOV 51H, B ;积高字节存51H MOV A, 31H MUL AB ;X2·Y ADD A, 51H ;X2·Y低8位与X1·Y高8位相加作为积的第二字节 MOV 51H, A MOV A, B ;乘积最高字节送A以便与低位进位C相加 ADDC A, #00H ;作用:将C与A相加,最高字节加低位进位C MOV 52H, A ;最高字节存52H单元 →B →A →B B← →A B← →A 52H, 51H, 50H 可能向高位产生进位C 11:58:09

64 2、除法指令(1条) 除法指令: DIV AB 该指令把累加器A中的8位无符号整数除以寄存器B中8 位无符号整数, 所得结果的商放在累加器A中,余数在 寄存器B中, 标志位CY和OV均清“0” 。 若除数(B中内容)不为0 注意: 若除数(B中内容)为0H, 则执行后 结果为不定值, 并置位溢出标志OV。 例, 设A内容为147(93H), B内容为13(0DH), 则执行命令: DIV AB 执行结果:A=0BH,B=04H,OV=0,CY=0 11:58:09

65 增量、减量指令(9条) 增量指令完成加1运算,减量运算完成减1运算。 这两条指令均不影响标志位(INC A, DEC A 影响标志P)。 1、增量指令(5条) INC A ;A ← A+1 INC addr8 ;(addr8) ←(addr8) +1 ;(Ri) ← (Ri) +1 INC Rn ;Rn ← Rn+1 INC DPTR ;DPTR ← DPTR+1 11:58:09

66 1、增量指令(5条) 注意: INC指令将指定变量加1,结果送回原地址单元, 原来内容若为0FFH,加1后将变成00H,运算结果不 影响任何标志位(INC A 影响奇偶标志位P)。 例如,设R0=7EH,内部数据RAM中 (7EH) =0FFH, (7FH) =40H,则执行指令: INC @R0 ; (7EH) ← 00H INC R ;R0 ← R0+1,执行后,R0=7FH INC @R0 ; (7FH) ← 41H 11:58:09

67 (若A=0, DEC A 后, A中还是偶数个1, 不影响P)
2、减量指令(4条) (DEC A 影响奇偶标志位P) DEC A ;A ← A - 1 DEC addr8 ;(addr8) ←(addr8) - 1 ;(Ri) ← (Ri) - 1 DEC Rn ;Rn ← Rn - 1 注意: DEC指令将指定变量减1, 结果送回原地址单元, 不影响任何标志位, 原内容若为00H, 减1后变成0FFH。 (若A=0, DEC A 后, A中还是偶数个1, 不影响P) 例如程序: MOV R1, #7FH ; (R1) ← 7FH MOV 7EH, #00H ; (7EH) ← 00H MOV 7FH, #40H ; (7FH) ← 40H DEC @R1 ; (7FH) ← 3FH ← 40H -1 DEC R ; (R1) ← 7EH← 7FH -1 DEC @R1 ; (7EH) ← 0FFH ← 00H -1 11:58:09

68 4.5.3.4 二——十进制的加法的调整指令(1条) DA指令使用说明 指令如下: DA A 该指令的调整条件和方法:
二——十进制的加法的调整指令(1条) 指令如下: DA A 该指令的调整条件和方法: 若A3-0>9或AC=1, 则A3-0←A3-0+06H; 若A7-4>9或CY=1, 则A7-4←A7-4+6H(A7-0←A7-0+60H)。 若两个条件同时满足或者A7-4=9且低4位修正有进位, 则A7-0←A7-0+66H。 原因:压缩BCD码要求按照十进制规则运算、进位, 但计算机只能按照16(二)进制规则运算、进位。 87 68 DA指令使用说明 EF 66 是对二—十进制加法进行调整的指令。 两个压缩型BCD码按二进制数规则相加, 须经本条指令 调整后才能得到压缩型的BCD码和数(可用87H+68H测 算)。 155 CY 11:58:09

69 DA指令使用说明 因指令要用AC、CY等标志位才能起到正确的调整作 用, 因此它需跟在加法(ADD, ADDC)指令后面使用。
若该指令前无加法指令, (不)能用DA A完成累加器A内 容的二十进制转换。 对用户而言,只要保证参加运算的两数为BCD码, 并先 对BCD码执行二进制加法运算(用ADD, ADDC指令), 然后紧跟一条DA A指令即可。 DA A指令不能对减法进行十进制调整。 DA指令不清除标志位C, 若高4位有进位, 则置C为1, 否则, 不改变进位标志C。 11:58:09

70 二——十进制调整指令 低字节 [例4-8] 设计6位BCD码加法程序。设被加数在内部RAM 中32H, 31H, 30H单元, 加数在42H, 41H,40H单元, 相加和 放在52H, 51H, 50H单元, 忽略加后最高位进位(溢出)。 解:程序代码如下: BCDADD:MOV A, 30H ;第一字节加 ADD A, 40H DA A MOV 50H,A ;存第一字节和(BCD码) MOV A, 31H ;第二字节加 ADDC A, 41H DA A MOV 51H, A ;存第二字节和(BCD码) MOV A, 32H ;第三字节加 ADDC A, 42H DA A MOV 52H,A ;存第三字节和(BCD码) (32H)(31H)(30H) +(42H)(41H)(40H) (52H)(51H)(50H) 11:58:09

71 设(30H)=67H, (40H)=56H 二——十进制调整指令 设(30H)=56H, (40H)=67H 【例4-9】假设有两个十进制数,被减数保存在30H单元, 减数保存在40H单元。编程实现二者的减法运算, 结果 存50H单元中。 解: 利用十进制加法调整指令进行十进制减法调整, 必须 采用补码相加的方法, 用9AH(即十进制100)减去减数即 得以10(每位, 两位为100)为模的减数补码。程序代码如 下: BCDSUB:CLR C ;清进位位 MOV A, #9AH ;求减数补码 SUBB A, 40H ;(40H)中是减数 ADD A, 30H ;进行补码相加 DA A MOV 50H, A ;结果(差)存50H单元 无十进制减法调整指令 讨论: 被减数大于减数时, 结果容易理解; 被减数小于减数时, 结果可看成向百位借位而得到的结果; 或将A再求补码即得绝对值: (9AH-(A)); 再处理符号位(见下页) 参见4.9 节 “多字节十进制BCD码减法” 11:58:09

72 §4.5.4 位操作指令(17条) 6个助记符, 另5个与字节操作相同
位操作指令以位作为处理对象, 可完成位传送、位状态 控制、位逻辑操作、位条件转移等功能, 共17条。 可被指令识别的位地址表示方式有如下几种: 直接用位地址(十进制或十六进制数)表示,或写成位 地址表达式表示。 写成字节地址加位数方式表示,二者之间用“.”号隔 开。例如0B8H.0 (IP.0),20H.1等。 位寄存器的定义名称(见头文件--附录B: STC15.INC, 附录C: stc15.h),如C (PSW.7)、EA (IE.7)等。 对位寻址寄存器, 可用字节寄存器名加位数来表示, 二 者之间用“.”号隔开。例如P1.0,PSW.4等。 用户使用伪指令事先定义过的符号地址。 11:58:09

73 表4-4 位操作指令的操作码助记符及对应的操作数
§4.5.4 位操作指令(17条) 6个助记符, 另5个与字节操作相同 表4-4 位操作指令的操作码助记符及对应的操作数 操 作 功 能 操作码 操作数 备注 位传送 MOV C, bit 或 bit, C 源地址和目的地址可互换 位状态控制 位清零 CLR C或 bit bit表示直接寻址位 位取反 CPL 位置位 SETB 位逻辑操作 ANL C⊕bit→ C C⊕/bit→ C ⊕表示做某种运算, /bit表示直接寻址位的非 ORL 位跳转 判C判移 JC rel rel为相对偏移量 JNC 判直接寻址位转移 JB bit,rel JNB为“0”转移, JB为“1”转移 JNB JBC JBC寻址位为1转移并清“0”该位 11:58:09

74 §4.5.4 位操作指令(17条) 6个助记符, 另5个与字节操作相同 11:58:09

75 §4.5.4 位操作指令(17条) 6个助记符, 另5个与字节操作相同 11:58:09

76 位传送指令(2条) MOV C, bit ; CY ← (bit) MOV bit, C ;(bit) ← CY 指令功能:是把第二操作数所指出的布尔变量传送到 由第一操作数指定的位单元中。 其中一个操作数必为位累加器(进位标志CY),另一个 可以是任何直接寻址位(bit)。 指令执行结果不影响其他寄存器或标志位。 例如, 设内部数据RAM中(20H)=79H,执行指令: MOV C, 07H ;07H是位地址, 即字节地址20H单元内容的第7位位置, ;指令将使CY=0。 20H CY 11:58:09

77 4.5.4.2 位状态控制指令(6条) 位状态控制指令包括位的清“0”、取反和置位。 1、位清“0”指令 (2条)
位状态控制指令(6条) 位状态控制指令包括位的清“0”、取反和置位。 1、位清“0”指令 (2条) CLR bit ;(bit) ← 0 CLR C ; CY ← 0 上述指令可使直接寻址位(bit)或位累加器CY清“0”, 不影响其他标志。 设内部RAM字节地址25H单元内容为34H ( B), 执行指令: CLR 2AH ;2AH为字节地址25H第2位的位地址 ;将使25H单元的内容变为30H( B) 图3-10 字节地址25H的位地址 11:58:09

78 4.5.4.2 位状态控制指令(6条) 2、位求反指令(2条) CPL bit ;(bit) ← ( ) CPL C ; CY ←
位状态控制指令(6条) 2、位求反指令(2条) CPL bit ;(bit) ← ( ) CPL C ; CY ← 上述指令可把直接寻址位(bit)或位累加器CY 内容取反,不影响其他标志。 例如,执行指令序列: MOV 25H, #5DH ;(25H)= B CPL 2BH ;(25H)= B CPL P ; P1.2求反, P1口字节地址 90H 图3-10 字节地址25H的位地址 11:58:09

79 4.5.4.2 位状态控制指令(6条) 3、位的置位指令(2条) SETB bit ;(bit)← 1 SETB C ; CY ← 1
位状态控制指令(6条) 3、位的置位指令(2条) SETB bit ;(bit)← 1 SETB C ; CY ← 1 上述指令把任何可寻址的位或进位标志CY置1, 不影响其他标志。 例如,P1口原已写入了49H( B),则执 行 SETB P1.7 ;将使P1口输出数据变为C9H( B)。 11:58:09

80 位逻辑操作指令(4条) 1、位逻辑与指令(2条) ANL C, bit ; CY ← CY∧(bit) ANL C, /bit ; CY ← CY∧( ) 将直接寻址位内容或直接寻址位内容取反后(原内容不 变)与位累加器CY进行逻辑“与” 操作, 结果存在CY中。 “/bit”表示对该寻址位内容取反后再进行位操作。 位逻辑 “与” 操作示意图如图示。 例:ANL C, /OV /OV OV 图4-37 a) ANL C, bit指令示意图 b) ANL C, /bit指令示意图 11:58:09

81 2、位逻辑或指令(2条) ORL C, bit ;CY ← CY ∨(bit) ORL C, /bit ;CY ← CY ∨(/bit) 上述指令将直接寻址位的内容或直接寻址位的内容取 反后(不改变原寻址内容)与位累加器CY进行逻辑“或” 操作,结果保存在CY中。 例:ORL C, /OV 位逻辑“或” 操作的示意图如图示。 /OV OV 图4-38 ORL指令逻辑示意图 11:58:09

82 位逻辑与、或指令举例 例如,编程实现: 当位地址(7FH)=1并且累加器中 (ACC.7)=1时, 进位位C置1, 否则C清0 , 可用ANL指 令实现。 可编程序如下: MOV C, 7FH ;CY←(7FH) ANL C, ACC.7 ;CY←CY∧ ACC.7 例, 将位地址7FH中的内容和累加器ACC.7中的内容相 “或”的程序(只要两个位的任一位为1则C为1)如下: MOV C, 7FH ORL C, ACC.7 ;相“或”的结果存CY中 11:58:09

83 4.5.4.4 位条件转移指令(5条) 位条件转移指令分为判CY转移和判直接寻址位状态 转移两种。 1、判CY转移指令(2条)
位条件转移指令(5条) 位条件转移指令分为判CY转移和判直接寻址位状态 转移两种。 1、判CY转移指令(2条) JC rel ; 若CY= 1,则PC←PC+rel,否则顺序执行 JNC rel ; 若CY= 0,则PC←PC+rel,否则顺序执行 上述两条指令通过判进位CY的状态决定程序的走向, 前一条若进位标志为1(后一条若进位标志为0)就可使 程序转向目标地址,否则顺序执行下一条指令。 目标地址为第二字节中的带符号的偏移量rel与PC的 当前值(PC←PC+2)之和,不影响任何标志。 (rel 一般用符号地址) 11:58:09

84 1、判CY转移指令(2条) JC rel指令操作过程如图a) JNC rel指令操作过程如图b) (rel 一般用符号地址) 程序flash
PC→ PC+1→ PC+2→ 1、判CY转移指令(2条) 1005H 40H 1006H rel 1007H JC rel指令操作过程如图a) JNC rel指令操作过程如图b) 现行的PC 下一指令地址 (rel 一般用符号地址) PC+rel (a)JC rel指令(机器码:40H rel) (b) JNC rel 指令(机器码:50H rel) 图4-39 JC指令和JNC指令执行示意图 11:58:09

85 1、判CY转移指令(2条) 在实际应用中,一般在rel的位置写入欲跳转到的标号 地址,偏移量由汇编程序自动进行计算。这样做有两 个好处,一是程序的可读性好,二是不必进行偏移量 的计算。 例如,程序段: ADD A, #30H ; 加法指令,影响标志位C JC L ;若C=1(有进位), 则转L2, 否则, 继续执行 L1: …… L2: …… 11:58:09

86 2、判直接寻址位转移指令(3条) JB bit, rel ;若(bit) =1, 则PC←PC+rel JNB bit, rel ;若(bit) =0, 则PC←PC+rel JBC bit, rel ;若(bit) =1, 则PC←PC+rel, 且 (bit) ←0 ;若条件不满足, 指令顺序执行。 三条指令操作过程分别如图a)、图b)和图c)所示。 (rel 一般用符号地址) Bit=1? PC←PC+rel (bit) ←0 Y N PC←PC+3 Bit=1? PC←PC+rel Y N PC←PC+3 Bit=0? PC←PC+rel Y N PC←PC+3 a) JB bit,rel 指令 b) JNB bit,rel 指令 c) JBC bit,rel 指令 11:58:09

87 2、判直接寻址位转移指令(3条) 应用中,一般在rel的位置写入欲跳转到的标号地址, 偏移量由汇编程序自动进行计算。例如,指令序列:
MOV P1, #0CAH ;P1←0CAH ( B) MOV A, #56H ;A←56H ( B) JB P1.2, L1 ;因P1.2=0, 不转L1, 而继续执行下条指令 JNB ACC.3, L ; ACC.3=0 转L2处执行 L1: …… L2: …… 11:58:09

88 2、判直接寻址位转移指令(3条) 另一段程序: MOV A, #43H ;A← 43H(0100 0011B)
JBC ACC.2, L1 ;因ACC.2=0, 不转L1,而继续执行下条指令 JBC ACC.6, L2 ;ACC.6=1 转L2执行, 且ACC.6← 0 L1: …… L2: …… 两段程序执行后均使程序转向L2处,但前段程序转移后 维持原变量ACC.3=0不变,后段程序却把原变量 ACC.6=1清0。 转移到L2后的A( B) 11:58:09

89 § 控制转移类指令 (17条) 13个助记符 使程序不按存放顺序执行, 而转到另外的地址去执行。 包括两种:程序转移指令、子程序调用和返回指令。 转移指令和调用指令的区别 转移指令只是跳转到新地址去,不再跳转回来; 调用指令只是暂时转到新的地址(子程序)处执行一段指令,执行完这一段指令以后再跳转回来,按照调用之前的顺序继续执行程序。 所以,调用指令要具有能够跳转回来并能够能继续执行调用之前程序的功能,这些功能都是借助堆栈(保护断点)的操作实现的。 11:58:09

90 § 控制转移类指令 (17条) 13个助记符 编程时都用标号地址 11:58:09

91 § 控制转移类指令 (17条) 13个助记符 11:58:09

92 13个助记符 表4-5 控制转移类指令(17条) (4条) (2条) 类 别 功 能 操作数 备注 无条件转移 长转移 LJMP
类 别 功 能 操作码 助记符 操作数 备注 无条件转移 长转移 LJMP addr16 addr16表示16位地址 绝对转移 AJMP addr11 Addr11指低11位地址数 相对短转移 SJMP rel rel带符号的8位相对偏移量 间接转移 JMP @A+DPTR A中是8位无符号数 条件 转移 判零转移 JZ rel JNZ 比较转移 CJNE #data8, rel A, addr8, rel (4条) 循环转移 DJNZ Rn, rel addr8, rel (2条) 子程序调用 和返回 长调用 LCALL addr16 绝对调用 ACALL addr11 子程序返回 RET 转移(调用)地址一般用符号地址) 其他 中断返回 RETI 空操作 NOP 11:58:09

93 1、程序转移指令(12条) (1)无条件转移指令 (4条) 长转移指令 LJMP 绝对转移指令 AJMP 相对短转移指令 SJMP
(2)条件转移指令 (8条) 累加器判零转移指令(JZ, JNZ) (2条) 比较转移指令 (CJNE) (4条) 循环转移指令 (DJNZ) (2条) 11:58:09

94 1、程序转移指令(12条) (1)无条件转移指令(4条)
无条件转移指令,是使程序不按照指令的存放顺序 执行,而是无条件转到另一处执行的指令,该类指 令不影响标志位。 实质上,无条件转移指令就是控制程序计数器PC从 现行值转移到目标地址。 长转移指令 LJMP addr16 绝对转移指令 AJMP addr11 相对短转移指令 SJMP rel 间接转移指令 JMP @A+DPTR 11:58:09

95 (1)无条件转移指令(4条) 1)长转移指令 LJMP addr16 ;PC←addr16
因直接提供16bit目标地址, 所以执行该指令可使程序从 当前地址转移到64KB程序存储器空间任何地址单元。 例如,如果在程序存储器0000H单元存放一条指令 LJMP H 执行结果:复位后程序将跳到0100H单元去执行。 11:58:09

96 (1)无条件转移指令(4条) 2)绝对转移指令 a10~a8 AJMP addrll 机器码: xxx00001 addr7~0
;PC←PC+2,PC15~11不变,PC10~0←addr10~0 第二字节存放的是低8位地址,第一字节5、6、7 位存放着高3位地址a10~a8。 注意:AJMP为双字节指令,当程序真正转移时PC 值已加2,因此,目标地址应与AJMP后面相邻指令 的第一字节地址在同一2KB范围内。 如果超过了2KB范围,汇编程序会提示出错。本指令 不影响标志位。 机器码: xxx00001 addr7~0 a10~a8 11:58:09

97 (1)无条件转移指令(4条) 3)相对短转移指令 SJMP rel ;PC←PC+2,PC←PC+rel
因而目标地址可以在这条指令首地址的前128字节到 后127字节之间。 11:58:09

98 (1)无条件转移指令(4条) 4)间接转移指令 JMP @A+DPTR ; PC←A+DPTR
执行16位加法时,从低8位产生的进位将传送到高 位去。 指令执行后不影响累加器和数据指针中的原内容, 不影响任何标志。 11:58:09

99 4)间接转移指令 JMP @A+DPTR ; PC←A+DPTR
这是一条极其有用的多分支选择转移指令,其转移 地址是在程序运行时动态决定的,这也是和前3条指 令的主要区别。 因此,可在DPTR中装入多分支转移程序的首地址, 而由累加器A的内容来动态选择其中的某一个分支 予以转移, 这就可用一条指令代替众多转移指令,实现以DPTR 内容为起始的256个字节范围的选择转移。 11:58:09

100 (1)无条件转移指令(4条) LJMP 、AJMP、 SJMP
在实际应用中,由于AJMP和SJMP指令的跳转范围 有限,而LJMP(长转移指令)不受跳转范围的限制, 因此,一般情况下都可使用LJMP指令代替AJMP和 SJMP指令。 L2 ; 转L2去执行 L1: …… L2: …… LJMP AJMP SJMP JMP 转移地址一般用符号地址, 直观易懂, 不易出错(包括下面条件转移指令) 11:58:09

101 (2)条件转移指令(8条) 条件转移指令,是以执行该指令时的状态标志为条件, 决定是否改变程序执行的顺序。符合条件就转移;不 符合条件就不转移,顺序执行指令。 条件转移指令属于短距离相对转移,适用于与绝对地 址无关的程序,跳转范围以当前地址为中心的-128~ +127字节之内。若转移距离超过短距离范围,则必须 使用两级以上的跳转。 条件转移指令有: 累加器判零转移指令(JZ, JNZ) (2条) 比较转移指令 (CJNE) (4条) 循环转移指令 (DJNZ) (2条) 11:58:09

102 (2)条件转移指令(8条) 1)累加器判零转移指令(2条) JZ rel (一般用符号地址); 若累加器为0则转移
JNZ rel (一般用符号地址); 若累加器不为0则转移 均为双字节,其中第二条字节为带符号的相对偏移量, PC现行值(PC加2后)与偏移量相加即得转移地址。该 指令不改变累加器内容,不影响标志位。 A≠0? PC←PC+rel Y N PC←PC+2 A=0? PC←PC+rel Y N PC←PC+2 图4-42 JZ和JNZ指令执行示意图 JZ rel JNZ rel 11:58:09

103 1)累加器判零转移指令(2条) 例如,执行程序: MOV A, P0 ; P0口内容送累加器A JZ L1 ; A=0, 则跳转L1去执行
DEC A ; A减1 L1: …… 11:58:09

104 2)比较转移指令(4条) CJNE (目的字节), (源字节),rel 比较转移指令有4条: CJNE A, #data8,rel
(一般用符号地址) 比较转移指令有4条: CJNE A, #data8,rel CJNE A, addr8,rel CJNE @Ri, #data8, rel CJNE Rn, #data8, rel 该指令比较前面两个操作数的大小,如果它们的值不 相等则转移,相等则继续执行。 三字节指令,PC当前值(PC+3 → PC)与指令第三 字节带符号的偏移量相加即得到转移地址。 对进位位CY有影响: 如果目的字节的无符号整数值小 于源字节的无符号整数值,则置位进位标志,否则清 “0”进位位,指令不影响任何一个操作数。 11:58:09

105 比较转移指令的操作过程 取完CJNE指令时 (rel 一般用符号地址) 图4-44 CJNE指令执行流程示意图 A, addr8,
L2 ; 转L2执行 L2: …… A, addr8, A, #data8, Rn, #data8, @Ri, #data8, CJNE (rel 一般用符号地址) 转移地址一般用符号地址, 直观易懂, 不易出错 图4-44 CJNE指令执行流程示意图 11:58:09

106 2)比较转移指令(4条) 例, 设(R7)=53H, 执行下列指令(判断两数的大小) CJNE R7, #68H, K1
;由于(R7)≠68H, 转K1, 且CY←1 (因(R7)<68H) … ; 在此处理相等的情况 K1: JC K ;因CY=1, 判断出 (R7)<68H, 转K3执行 K3: … 11:58:09

107 (2)条件转移指令(8条) 3) 循环转移指令(2条) DJNZ (字节),rel (用于控制循环次数和转移地址) 这是一条字节内容减1并与0比较的指令, 程序每执行一次该指令, 就把字节变量减1, 结果再送回 到字节中, 并判字节内容是否为0, 不为0转移, 否则顺 序执行。 注意: 若字节变量原值为00H, 则指令执行后, 变为0FFH (不影响任何标志), 从而DJNZ循环要执行256次。 循环转移指令共有两条: DJNZ direct, rel DJNZ Rn, rel 11:58:09

108 3)循环转移指令(2条) 循环转移指令共两条: DJNZ direct, rel DJNZ Rn, rel 指令操作过程如图。
内容先减1,然后再判断是否为0? (rel 一般用符号地址) 循环转移的目标地址为DJNZ之后相邻指令的第一个字 节地址与带符号的相对偏移量相加之和。 用该指令很容易构成循环, 只要给直接地址或工作寄存 器赋不同初值, 就可方便地控制循环次数, 而用不同的 工作单元或寄存器就可派生出很多条循环转移指令。 11:58:09

109 软件延时就是使程序在运行时消耗时间,是 经常采用的方法,这种方法节约硬件成本, 使用灵活,计时精确;
3)循环转移指令(2条) DJNZ用于软件延时 软件延时就是使程序在运行时消耗时间,是 经常采用的方法,这种方法节约硬件成本, 使用灵活,计时精确; 但是占用了CPU的时间,经常使用在对CPU 的使用效率要求不苛刻的情况下。 11:58:09

110 3)循环转移指令(2条) DJNZ实现软件延时 (对传统8051单片机)
DJNZ指令执行时间为2 个机器周期(24个时钟) , 循环一 次可产生2个机器周期延时。当主频12MHz, 循环次数 为24次时, 下面的程序可产生49us的软件延时循环, 在 P1.0引脚上输出一个50μs的负脉冲。(传统8051单片机) CLR P ;12T(12个时钟), P1. 70输出变低电平 MOV R2, #18H ;12T, 赋循环初值 HERE: DJNZ R2, HERE ;24T, R2 ← R2-1,不为零继续循环 SETB P ;12T, P1.70输出高电平 循环延时时间大约为: (12+(24*24))/12MHz=49μs P1.0引脚输出50μs负脉冲: (12+ (12+(24*24))/12MHz=50μs 11:58:10

111 3)循环转移指令(2条) DJNZ实现软件延时 (对STC15系列单片机)
DJNZ指令执行时间为2 4个机器周期时钟, 循环一次可 产生2 4个机器周期时钟延时。当主频12MHz, 循环次数 为24次时, 下面程序可产生49μs的软件延时循环, 在P1.0 引脚上输出一个50μs的负脉冲。(对STC15系列单片机) CLR P ;3T(3个时钟), P1. 70输出变低电平 MOV R2, #18H ;2T, 赋循环初值 HERE: DJNZ R2, HERE ;4T, R2 ← R2-1,不为零继续循环 SETB P ;3T, P1. 70输出高电平 8.167μs 8.417μs 循环延时时间大约为: (2+(24*4))/12MHz =8.167μs P1.0引脚输出负脉冲: (3+2+(24*4))/12MHz =8.417μs 11:58:10

112 STC15系列单片机每条指令时钟数 STC15系列单片机每条指令时钟数 11:58:10

113 STC15系列单片机每条指令时钟数 STC15系列单片机每条指令时钟数 11:58:10

114 STC15系列单片机每条指令时钟数 STC15系列单片机每条指令时钟数 11:58:10

115 STC15系列单片机每条指令时钟数 STC15系列单片机每条指令时钟数 11:58:10

116 STC15系列单片机每条指令时钟数 STC15系列单片机每条指令时钟数 11:58:10

117 STC15系列单片机每条指令时钟数 STC15系列单片机每条指令时钟数 11:58:10

118 3)循环转移指令(2条) DJNZ实现重复执行程序代码
例, 多个单字节数求和: 设数组长度放R0, 数组首地址放 在R1中, 数组和保存在20H单元中, 假设相加结果不大于 256(不考虑加法进位)。编程如下: MOV R0, #10;设置数组长度 MOV R1, #30H;设置数组首地址 CLR A ; A清0 SUMC:ADD ; 相加 INC R1 ; 数据地址指针增1 DJNZ R0, SUMC ; 字节数计数器减1, 不为0继续加 MOV 20H, A ; 结果存20H单元 地址 数据 30H 04H 31H 08H 32H 15H 33H 34H 23H R1=30H→ 11:58:10

119 §4.5.5 控制转移类指令(17条)(续) (3条) 1、程序转移指令(12条) (已讲) 无条件转移 (4条) 条件转移(8条)
§ 控制转移类指令(17条)(续) 1、程序转移指令(12条) (已讲) 无条件转移 (4条) 条件转移(8条) 2、子程序调用和返回指令(3+2条) 长调用指令 绝对调用指令 返回指令 中断返回指令 空操作指令NOP (3条) 11:58:10

120 2、子程序调用和返回指令 子程序的功能 子程序就是用来对一系列指令进行封装,实现模块化、可重用化及抽象化,从而有利于程序的结构化开发,使程序结构更清晰。 合理划分代码结构是软件成功的基本保障。 每种微处理器或者微控制器都有子程序的调用和返 回指令。 对于STC15F2K60S2单片机来说,有两条调用指令: LCALL(长调用)及ACALL(绝对调用)和一条与之配 对的子程序返回指令RET。 11:58:10

121 2、子程序调用和返回指令 (1)长调用指令 LCALL addr16 ; PC ←PC+3 SP←SP+1 (SP)←PC7~0
PC ←addr16 下条指令地址 断点低8位地址 操作 (保护断点) 断点高8位地址 跳转到被调用程序地址 长调用与LJMP一样提供16位地址,可调用64KB范围内所指定的子程序。 例:LCALL STR ;表示调用STR子程序 11:58:10

122 2、子程序调用和返回指令 (2)绝对调用指令 ACALL addr11 ; PC ←PC+2 SP←SP+1 (SP)←PC7~0
PC10~0 ←addr11 PC15~11不变 下条指令地址 断点低8位地址 操作 断点高8位地址 跳转到调用程序地址 该指令提供11位目标地址,限在2KB地址范围内调用 子程序,由于受2KB的限制,因此,一般程序中使用 LCALL指令代替。 11:58:10

123 2、子程序调用和返回指令 (3)返回指令 PC15~8←(SP) SP←SP-1 PC7~0←(SP) RET; 操作
调用指令的下条指令地址 (3)返回指令 RET; PC15~8←(SP) SP←SP-1 PC7~0←(SP) 恢复高8位断点地址 操作 恢复低8位断点地址 RET表示子程序结束,要返回主程序,从堆栈中弹出 调用子程序时压入的返回地址, 使程序从调用指令(LCALL或ACALL) 的下面一条相 邻指令处开始继续执行。 11:58:10

124 2、子程序调用和返回指令 (4)中断返回指令 PC15~8←(SP) SP←SP-1 PC7~0←(SP) RETI; 操作
中断时执行指令的下条指令地址 PC15~8←(SP) SP←SP-1 PC7~0←(SP) 恢复高8位断点地址 RETI; 操作 恢复低8位断点地址 操作还包括: 将相应中断优先级状态触发器清0,将 不可寻址的“优先级生效”触发器清零的功能。通 知中断系统,中断服务程序已执行完毕。 该指令用于中断服务子程序的返回, 其执行过程类似 RET, 但不能由RET替代, 详见与中断有关的章节。 11:58:10

125 2、子程序调用和返回指令 (5)空操作指令NOP NOP ;PC←PC+1 执行本指令除了PC加1外不作任何操作,而转向下一 条指令去执行。不影响任何寄存器和标志位。 由于是单周期指令,所以时间上只有一个机器周期。 常用于精确延时或时间上的等待。 11:58:10

126 (5)空操作指令NOP 例如,利用NOP指令产生方波。 LOOP: CLR P2.7 ;P2.7清0输出 NOP ;空操作 NOP
SETB P2.7 ;置位P2.7高电平 LJMP LOOP 11:58:10

127 第4章 作业 基本: 4-1; 4-2; 4-3; 4-4; 4-5; 4-6; 4-12; 综合: 4-11; 4-14; 11:58


Download ppt "第四章 指令系统及汇编语言程序设计."

Similar presentations


Ads by Google