指令系统及汇编.ppt

上传人:本田雅阁 文档编号:2798326 上传时间:2019-05-18 格式:PPT 页数:256 大小:1.37MB
返回 下载 相关 举报
指令系统及汇编.ppt_第1页
第1页 / 共256页
指令系统及汇编.ppt_第2页
第2页 / 共256页
指令系统及汇编.ppt_第3页
第3页 / 共256页
指令系统及汇编.ppt_第4页
第4页 / 共256页
指令系统及汇编.ppt_第5页
第5页 / 共256页
点击查看更多>>
资源描述

《指令系统及汇编.ppt》由会员分享,可在线阅读,更多相关《指令系统及汇编.ppt(256页珍藏版)》请在三一文库上搜索。

1、第3章 指令系统及汇编,3.1 MCS51单片机汇编语言与指令格式 3.2 寻址方式 3.3 MCS51单片机指令系统 3.4 汇编语言及汇编语言程序设计 3.5 基本程序设计方法 3.6 程序设计举例,3.1 MCS51单片机汇编语言与指令格式,3.1.1 单片机的汇编语言 由于构成计算机的电子器件特性所决定, 计算机只能识别二进制代码。 这种以二进制代码来描述指令功能的语言, 称之为机器语言, 用机器语言组成的程序, 称为目标程序。 计算机就是按照机器语言的指令来完成各种功能操作的, 它具有程序简捷、 占用存储空间小、 执行速度快、 控制功能强等特点。,3.1.2 指令格式 MCS51单片

2、机汇编语言指令的标准格式如下: 标号: 操作码 目的操作数 , 源操作数 ; 注释 例如: LOOP: ADD# A, 10H ; (A)(A)+10H (1) 方括号 表示该项是可选项, 可有可无。 (2) 标号是用户设定的符号, 它实际代表该指令所在的地址。 标号必须以字母开头, 其后跟18个字母或数字, 并以“:”结尾。,(3) 操作码是用英文缩写的指令功能助记符。 它确定了本条指令完成什么样的操作功能。 如: ADD表示加法操作。 任何一条指令都必须有该助记符项, 不得省略。 (4) 目的操作数提供操作的对象, 并指出一个目标地址, 表示操作结果存放单元的地址, 它与操作码之间必须以一

3、个或几个空格分隔。 如上例中A表示操作对象是累加器A的内容, 并指出操作结果又回送A存放。,(5) 源操作数指出的是一个源地址(或立即数), 表示操作的对象或操作数来自何处。 它与目的操作数之间要用“,”号隔开。 (6) 注释部分是在编写程序时, 为了增加程序的可读性, 由用户拟写对该条指令或该段程序功能的说明。 它以分号“;”开头, 可以用中文、 英文或某些符号来表示, 显然它不存入计算机, 只出现在源程序中。,3.1.3 指令中常用符号 在分类介绍各类指令之前, 先对描述指令的一些符号意义进行一些简单约定: (1) Ri和Rn: R表示当前工作寄存器区中的工作寄存器, i表示0或1, 即R

4、0和R1。 n表示07, 即R0R7, 当前工作寄存器的选定是由PSW的RS1和RS0位决定的。 (2) data: 表示立即数, data为8位常数。 data是指包含在指令中的8位立即数。,(3) data16: 包含在指令中的16位立即数。 (4) rel: 相对地址, 以补码形式表示的地址偏移量, 范围为-128+127, 主要用于无条件相对短转移指令SJMP和所有的条件转移指令中。 (5) addr16: 16位目的地址。 目的地址可在全部程序存储器的64 KB空间范围内, 主要用于无条件长转移指令LJMP和子程序长调用指令LCALL中。 (6) addr11: 11位目的地址。 目

5、的地址应与下条指令处于相同的2 KB程序存储器地址空间范围内, 主要用于绝对转移指令AJMP和子程序绝对调用指令ACALL指令中。,(7) direct: 表示直接寻址的地址, 即8位内部数据存储器RAM的单元地址(0127/255), 或特殊功能寄存器SFR的地址。 对于SFR可直接用其名称来代替其直接地址。 (8) bit: 内部数据存储器RAM和特殊功能寄存器SFR中的可直接寻址位地址。 (9) : 间接寻址寄存器或基地址寄存器的前缀, 如Ri, DPTR, 表示寄存器间接寻址。,(10) (X): 表示X中的内容。 (11) (X): 表示由X寻址的单元中的内容, 即(X)作地址, 该

6、地址的内容用(X)表示。 (12) / 和符号: /表示对该位操作数取反, 但不影响该位的原值。 表示指令操作流程, 将箭头一方的内容, 送入箭头另一方的单元中去。,3.2 寻址方式,3.2.1寄存器寻址 选定某寄存器, 自该寄存器中读取或存放操作数, 以完成指令规定的操作, 称为寄存器寻址。 例如: MOV A, R0 ; (A)(R0) 该指令的功能是把工作寄存器R0中的内容传送到累加器A中, 如: R0内容为FFH, 则执该指令后A的内容也为FFH。 在该条指令中, 源操作数和目的操作数是由寻址R0和A寄存器得到的, 故属于寄存器寻址。 该指令为单字节指令, 机器代码为E8H。,3.2.

7、2 立即寻址 操作数直接出现在指令中, 它紧跟在操作码的后面, 作为指令的一部分与操作码一起存放在程序存储器内, 可以立即得到并执行, 不需要另去寄存器或存储器等处寻找和取数, 故称为立即寻址。 该操作数称为立即数, 并在其前冠以“”号作前缀, 以表示并非地址。 立即数可以是8位或16位, 用十六进制数表示。,例如: MOV A, 0FH ; (A)0FH 该指令的功能是将立即数0FH传送到累加器A中, 对应的机器码为74H。 它隐含了寄存器寻址累加器A方式, 长一个字节, 占用一个存储单元; 立即数0FH紧跟在操作码之后, 成为指令代码的一部分, 长也是一个字节, 占用紧跟在后面的另一个存储

8、单元。 故该指令为双字节指令, 其机器码为74H 0FH。,3.2.3寄存器间接寻址 由指令指出某一个寄存器的内容作为操作数地址的寻址方法, 称为寄存器间接寻址方法, 简称寄存器间址。 这里要强调的是: 寄存器的内容不是操作数本身, 而是操作数地址。 寄存器间接寻址使用所选定寄存器区中的R0和R1作为地址指针(对堆栈操作时, 使用堆栈指针SP), 来寻址片内数据存储器RAM(00FFH)的256个单元, 但它不能访问特殊功能寄存器SFR。 寄存器间接寻址也适用于访问外部数据存储器, 此时, 用R0、 R1或DPTR作为地址指针。 寄存器间接寻址用符号“”指明。,图31 寄存器间接寻址示意图,3

9、.2.4 直接寻址 指令中直接给出操作数所在的存储器地址, 以供寻址取数或存数的寻址方式称为直接寻址。 例如: MOV A, 40H ; (A)(40H) 该指令的功能是把内部数据存储器RAM 40H单元内的内容送到累加器A。 指令直接给出了源操作数的地址40H。 该指令的机器码为E5H 40H。,3.2.5 变址寻址 基址寄存器加变址寄存器间接寻址, 简称变址寻址。 它以数据指针DPTR或程序计数器PC作为基址寄存器, 累加器A作为变址寄存器, 两者的内容相加形成16位程序存储器地址, 该地址就是操作数所在地址。 例如: MOVC A, A+DPTR ; (A)(A)+(DPTR) 该指令寻

10、址及操作功能如图32所示, 该指令为单字节指令, 机器代码为93H。 这种寻址方式常用于访问程序存储器中的常数表。,图32 变址寻址示意图,3.2.6 相对寻址 相对寻址是以当前程序计数器PC值加上指令规定的偏移量rel , 而构成实际操作数地址的寻址方法。 它用于访问程序存储器, 常出现在相对转移指令中。 在使用相对寻址时要注意以下两点: 第一, 当前PC值是指相对转移指令所在地址(一般称为源地址)加上转移指令字节数。 即: 当前PC值 = 源地址 + 转移指令字节数。 例如: JZ rel 是一条累加器A为零就转移的双字节指令。 若该指令地址(源地址)为2050H, 则执行该指令时的当前P

11、C值即为2052H。,第二, 偏移量rel是有符号的单字节数, 以补码表示,其相对值的范围是-128+127(即00HFFH), 负数表示从当前地址向上转移, 正数表示从当前地址向下转移。 所以, 相对转移指令满足条件后, 转移的地址(一般称为目的地址)应为: 目的地址 = 当前PC值 + rel = 源地址 + 转移指令字节数 + rel例如: 指令JZ 08H和JZ 0F4H 表示累加器A为零条件满足后, 从源地址(2050H)分别向下、 向上转移10个单元。 其相对寻址示意如图33(a)、 (b)所示。 这两条指令均为双字节指令, 机器代码分别为: 60H 08H和60H F4H。,图3

12、3 相对寻址示意图 (a)指令JZ 08H寻址示意图; (b)指令JZ F4H寻址示意图,3.2.7 位寻址 MCS51系列单片机具有位寻址的功能, 即指令中直接给出位地址, 可以对内部数据存储器RAM中的128位和特殊寄存器SFR中的93位进行寻址, 并且位操作指令可对地址空间的每一位进行传送及逻辑操作。 例如: SETB PSW.3 ; (PSW.3)1 该指令的功能是给程序状态字PSW中的RS0置1。 该指令为双字节指令, 机器代码为D2H D3H, 指令的第二字节直接给出位地址D3H(PSW.3的位地址)。,综上所述, 在MCS51系列单片机的存储空间中, 指令究竟对哪个存储器空间进行

13、操作是由指令操作码和寻址方式确定的。 7种寻址方式如表31所示。,表31 7 种寻址方式及使用空间,3.3 MCS51单片机指令系统,MCS51单片机指令系统分为: 数据传送类指令、 算术运算类指令、 逻辑运算及移位类指令、 控制转移类指令和位操作(布尔操作)指令5大类, 共计111条指令。 现按其分类分别介绍各条指令的格式、 功能、 对状态标志的影响以及应用。,3.3.1 数据传送类指令 数据传送类指令共29条, 它是指令系统中最活跃、 使用最多的一类指令。 一般的操作是把源操作数传送到目的操作数, 即指令执行后目的操作数改为源操作数, 而源操作数保持不变。 若要求在进行数据传送时, 不丢失

14、目的操作数, 则可以用交换型传送指令。,数据传送类指令不影响进位标志CY、 半进位标志AC和溢出标志OV, 但当传送或交换数据后影响累加器A的值时, 奇偶标志P的值则按A的值重新设定。 按数据传送类指令的操作方式, 又可把传送类指令分为3种类型: 数据传送、 数据交换和堆栈操作, 并使用8种助记符: MOV、 MOVX、 MOVC、 XCH、 XCHD、 SWAP、 PUSH及POP。 表32给出了各种数据传送指令的操作码助记符和对应的操作数。,表32 数据传送类指令助记符与操作,1. 内部数据存储器间数据传送指令 内部数据存储器RAM区是数据传送最活跃的区域, 可用的指令数也最多, 共有16

15、条指令, 指令操作码助记符为MOV。 内部RAM之间源操作数传递关系如图34所示。 为了便于理解指令功能, 我们按源操作数的寻址方式逐一介绍各条指令。 (1) 立即寻址。 在该寻址方式下, 内部RAM区数据传送指令有如下5条指令。,图34 内部RAM间数据传递关系,操作码助记符 目的操作数 源操作数 功能注释 机器代码(H) MOV A, data ; (A) data , 74 data MOV direct, data ; (direct) data , 75 direct data MOV Ri, data ; (Ri) data , 7677 data MOV Rn, data ; (

16、Rn) data , 787F data MOV DPTR, data16 ; (DPTR) data16 , 90 data158data70,这组指令表明, 8位立即数可以直接传送到内部数据区RAM的各个位置, 并且可把16位立即数直接装入数据指针DPTR。 把立即数送入累加器A的传送指令在3.2.2节中已作了介绍, 其它指令的功能及应用举例如下: MOV direct, data ; (direct) data # , 75 direct data 该指令的功能是把立即数传送到内部数据存储器RAM的00H7FH, 以及特殊功能寄存器SFR的各单元中去, 它为三字节指令。 例如把立即数40

17、H传送到RAM的30H单元和P1口(口地址为90H), 可采用如下指令:,MOV 30H, 40H ; (30H) 40H, 75 30 40 MOV P1, 40H ; (90H) 40H, 75 90 40 MOV Ri, data ; (Ri) data, 7677 data 该指令的功能是把立即数传送到由R0和R1寄存器的内容指出的片内数据存储器RAM的单元中去(MCS51系列为00H7FH, MCS52系列为00HFFH)。 MOV R0, 30H ; (R0) 30H , 78 30 MOV R0, 40H ; (R0) 40H , 76 40, MOV Rn, data ; (R

18、n) data , 787F data 该指令的功能是把立即数传送到内部寄存器R0R7中去,该指令为双字节指令, 机器代码为:, MOV DPTR, data16 ; (DPTR) data16 , 90 data 158 data 70 该指令的功能是把16位立即数装入数据指针DPTR中去。 它是MCS51系列单片机指令系统中唯一的一条16位数据传送指令。 该指令为三字节指令, 第一字节为90H, 第二字节为高8位立即数, 第三字节为低8位立即数。 例如: MOV DPTR, 1234H指令执行后, DPTR寄存器的高8位寄存器DPH的内容为12H, 低8位寄存器DPL内容为34H。 该指令

19、的机器代码为90H 12H 34H。,(2) 寄存器寻址。 在该寻址方式下, 内部RAM区数据传送指令有以下5条: MOV direct, A # ; (direct) (A) , F5 direct MOV Ri, A ; (Ri) (A) , F6F7 MOV Rn, A ; (Rn) (A) , F8FF MOV A, Rn ; (A) (Rn) , E8EF MOV direct, Rn ; (direct) (Rn) , 888F direct,这组指令的功能是把累加器A的内容传送到内部数据区RAM的各个单元, 或者把指定工作寄存器R0R7中的内容传送到累加器A或direct所指定的

20、片内RAM的00H7FH单元或特殊功能寄存器SFR中去。 但不能用这类指令在内部工作寄存器之间直接传送。 例如: 不存在MOVR1, R2这样的指令。,(3) 直接寻址。 在该寻址方式下, 内部RAM区数据传送指令有如下4条指令: MOV A, direct ; (A) (direct) , E5 direct MOV Rn, direct ; (Rn) (direct) , A8AF direct MOV Ri, direct ; (Ri) (direct) , A6A7 direct MOV direct2, direct1; (direct2) (direct1) , 85 direct

21、1 direct2,这组指令将直接地址所规定的内部RAM单元(片内RAM的00H7FH, SFR的80HFFH单元)内容传送到累加器A , 寄存器Rn, 并能实现内部数据寄存器RAM之间、 特殊功能寄存器SFR之间或SFR与内部RAM之间的直接数据传递。 直接传递不需要通过累加器A或者工作寄存器来间接传送, 从而提高了数据传送的效率。,例如: MOV P2 , P1 ; (P2) (P1) , 85 90 A0 该指令的功能是不通过其它寄存器, 直接把P1口(口地址90H)的内容传送到P2口(口地址A0H)输出, 提高了效率。 该指令为三字节指令, 机器代码为85H 90H A0H。,(4)

22、寄存器间接寻址。 在该寻址方式下, 内部RAM区数据传送指令有以下两条: MOV A, Ri ; (A) (Ri) , E6E7 MOV direct, Ri ; (direct) (Ri) , 8687 direct 这组指令把以Ri的内容作为地址进行寻址所得到单元的内容, 传送到累加器A或direct指定的片内RAM区单元。,例如: 设内部RAM (30H)=40H, (40H)=10H, (10H)=00H, 端口(P1)=CAH, 分析以下程序执行后各单元及寄存器、 P2口的内容。 MOV R0, 30H ; (R0) 30H , 78 30 MOV A, R0 ; (A) (R0)

23、, E6 MOV R1, A ; (R1) (A) , F9 MOV B, R1 ; (B) (R1) , 87 F0 MOV R1, P1 ; (R1) (P1) , A7 90 MOV P2, P1 ; (P2) (P1) , 85 90 A0 MOV 10H, 20H ; (10H) 20H , 75 10 20,2. 外部数据存储器数据传送指令 MCS51单片机CPU对片外扩展的数据存储器RAM或I/O口进行数据传送, 必须采用寄存器间接寻址的方法, 通过累加器A来完成。 一般数据的传送是通过P0口和P2口完成的, 即片外RAM地址总线低8位由P0口送出, 高8位由P2口送出, 数据总

24、线(8位)也由P0口传送(双向), 但与低8位地址总线是分时传送的。 这类数据传送指令共有以下4条单字节指令, 指令操作码助记符标志为MOVX。,MOVX A, DPTR ; (A) (DPTR) , E0 MOVX A, Ri ; (A) (Ri) , E2E3 MOVX DPTR, A ; (DPTR) (A) , F0 MOVX Ri, A ; (Ri) (A) , F2F3,例如: 设外部RAM (0203H)=FFH, 分析以下指令执行后的结果。 MOV DPTR, 0203H ; (DPTR) 0203H , 90 02 03 MOVXA, DPTR ; (A) (DPTR) ,

25、E0 MOV 30H, A ; (30H) (A) , F5 30 MOV A, 0FH ; (A) 0FH , 74 0F MOVXDPTR, A ; (DPTR) (A) , F0 执行结果为: (DPTR)=0203H, (30H)=FFH, (0203H)=(A)=0FH。,3. 程序存储器向累加器A传送数据指令 程序存储器向累加器A传送数据指令, 又称查表指令。 它采用变址寻址方式, 把程序存储器(ROM或EPROM)中存放的表格数据读出, 传送到累加器A。 它共有如下两条单字节指令, 指令操作码助记符为MOVC。 MOVC A, A+DPTR; (A) (A)+(DPTR) , 9

26、3 MOVC A, A+PC; (PC) (PC)+1, (A) (A)+(PC) , 83,例1: 在外部ROM/EPROM中, 从2000H单元开始依次存放09的平方值: 0、 1、 4、 9、 、 81, 要求依据累加器A中的值(09)来查找所对应的平方值, 分析下述程序的结果。 MOV DPTR, 2000H ; (DPTR) 2000H, 90 20 00 MOV A, 09H ; (A) 09H , 74 09 MOVC A, A+DPTR ; (A) (A)+(DPTR) , 93 执行结果: (DPTR)=2000H, (A)=51H(81的十六进制数)。,例2: 仍以例1外部

27、ROM/EPROM 2000H单元开始存放09的平方值, 以PC作为基址寄存器进行查表。 解: 设MOVC指令所在地址(PC)=1FF0H, 则 偏移量 = 2000H(1FF0H+1) = 0FH 相应的程序如下: MOV A, 09H ; (A) 09H , 74 09 ADD A, 0FH ; 地址调整 , 24 0F MOVC A, A+PC ; (A) (A)+(PC)+1) , 83 执行结果为: (PC)=1FF1H, (A)=51H。,4. 数据交换指令 数据传送类指令一般都用来将操作数自源地址传送到目的地址, 指令执行后, 源地址的操作数不变, 目的地址的操作数则修改为源地址

28、的操作数。 而数据交换指令其数据作双向传送, 涉及传送的双方互为源地址、 目的地址, 指令执行后各方的操作数都修改为另一方的操作数。 因此, 两操作数均未冲掉、 丢失。 数据交换类指令共有如下5条指令:,XCH A, direct ; (A) (direct) , C5 direct XCH A, Ri ; (A) (Ri) , C6C7 XCH A, Rn ; (A) (Rn) , C8CF XCHD A, Ri ; (A30) (Ri)30) , D6D7 SWAP A ; (A74) (A30) , C4,例3: 设(R0)=30H, (30H)=4AH, (A)=28H, 则: 执行

29、XCH A, R0 ; 结果为 : (A)=4AH, (30H)=28H 执行 XCHD A, R0 ; 结果为 : (A)=2AH, (30H)=48H 执行 SWAP A ; 结果为 : (A)=82H,5. 堆栈操作类指令 堆栈操作有进栈和出栈操作, 即压入和弹出数据, 常用于保存或恢复现场。 该类指令共有如下两条指令: (SP)(SP)+1 (SP)(direct) (direct)(SP) (SP)(SP)-1,C0 direct,PUSH direct,POP direct,D0 direct,例4: 若在外部ROM/EPROM中2000H单元开始依次存放09的平方值, 数据指针(

30、DPTR)=3A00H, 用查表指令取出2003H单元的数据后, 要求保持DPTR中的内容不变。 完成以上功能的程序如下:,MOV A, 03H ; (A) 03H , 74 03 PUSH DPH ; 保护DPTR高8位入栈 , C0 83 PUSH DPL ; 保护DPTR低8位入栈, C0 82 MOV DPTR , 2000H ; (DPTR) 2000H, 90 20 00 MOVC A, A+DPTR ; (A) (2000H+03H) , 93 POP DPL ; 弹出DPTR低8位 , D0 82 POP DPH ; 弹出DPTR高8位, (先进后出) , 83,3.3.2 算

31、术运算类指令 算术运算类指令共有24条, 可分为加法、 带进位加法、 带借位减法、 加1减1, 乘除及十进制调整指令共6组。 它主要完成加、 减、 乘、 除四则运算, 以及增量、 减量和二十进制调整操作, 对8位无符号数可进行直接运算; 借助溢出标志, 可对带符号数进行2的补码运算; 借助进位标志, 可进行多字节加减运算, 也可以对压缩BCD码(即单字节中存放两位BCD码)进行运算。,1. 加法指令 加法指令共有如下4条指令, 操作数助记符为ADD。 ADD A, data ; (A) (A)+data , 24 data ADD A, direct ; (A) (A)+(direct) ,

32、25 direct ADD A, Ri ; (A) (A)+(Ri) , 2627 ADD A, Rn ; (A) (A)+(Rn) , 282F,这4条指令使得累加器A可以和内部RAM的任何一个单元的内容进行相加, 也可以和一个8位立即数相加, 相加结果存放在A中。 无论是哪一条加法指令, 参加运算的都是两个8位二进制数。 对用户来说, 这些8位数可当作无符号数(0255), 也可以当作带符号数(-128+127), 即补码数。 例如: 对于二进制数11010011, 用户可认为它是无符号数, 即为十进制数211, 也可以认为它是带符号数, 即为十进制负数-45。 但计算机在作加法运算时,

33、总按以下规定进行:,(1) 在求和时, 总是把操作数直接相加, 而无须任何变换。 例如, 若A=11010011B, R1=11101000B, 执行指令ADD A, R1时, 其算式表达为: 11010011 + 11101000 1 10111011 相加后(A)=10111011B。 若认为是无符号相加, 则A的值代表十进制数187; 若认为是带符号补码数相加, 则A的值为十进制负数-69。,(2) 在确定相加后进位标志CY的值时, 总是把两个操作数作为无符号数直接相加而得出进位CY值。 如上例中, 相加后CY=1。 若为无符号数相加CY代表十进制数256, 但若是两个带符号数相加, C

34、Y没有意义。 (3) 在确定相加后溢出标志OV的值时, 计算机总是把操作数当作带符号数来对待。 在作加法运算时, 一个正数和一个负数相加是不可能产生溢出的, 只有两个同符号数相加才有可能产生溢出, 表示运算结果出错。,(4) 加法指令还会影响半进位标志和奇偶标志P。 在上述例子中, 由于D3相加对D4没有进位, 所以AC=0, 而由于运算结果A中1的数目为偶数, 故P=0。 例如: 设(A)=49H, (R0)=6BH, 执行指令: ADD A, R0 ; (A) (A)+(R0) , 28 结果为: (A)=B4H, OV=1, CY=0, AC=1, P=0。,2. 带进位加法指令 带进位

35、加法指令有如下4条指令, 其助记符为ADDC。 ADDC A, data ; (A) (A)+(CY)+data , 34 data ADDC A, direct ; (A) (A)+(CY)+(direct) , 35 direct ADDC A, Ri ; (A) (A)+(CY)+(Ri) , 3637 ADDC A, Rn ; (A) (A)+(CY)+(Rn) , 383F,例如: 设(A)=C3H, 数据指针低位(DPL)=ABH, CY=1 执行指令: ADDC A, DPL ; (A) (A)+(CY)+(DPL) , 35 82 结果为: (A)=6FH, CY=1, OV=

36、1, AC=0, P=0。,例1: 双字节无符号数加法(R0 R1)+(R2 R3) (R4 R5)R0、 R2、 R4存放16位数的高字节, R1、 R3、 R5存放低字节。 由于不存在16位数加法指令, 所以只能先加低8位, 后加高8位, 而在加高8位时要连低8位相加时产生的进位一起相加。 假设其和不超过16位, 其编程如下:,MOV A, R1 ; 取被加数低字节 , E9 ADD A, R3 ; 低字节相加 , 2B MOV R5, A ; 保存和低字节 , FD MOV A, R0 ; 取高字节被加数 , E8 ADDC A, R2 ; 两高字节之和加低位进位, 3A MOV R4,

37、 A ; 保存和高字节 , FC,3. 带借位减法 带借位减法指令有如下4条指令, 其助记符为SUBB。 SUBB A, data ; (A) (A)(CY)data , 94 data SUBB A, direct ; (A) (A)(CY)(direct) , 95 direct SUBB A, Ri ; (A) (A)(CY)(Ri) , 9697 SUBB A, Rn ; (A) (A)(CY)(Rn) , 989F,由于减法指令只有带借位减法指令, 因此, 若要进行不带借位位的减法操作, 需先清借位位, 即置CY=0。清CY有专门的指令,它属于位操作类指令(详见3.3.5节),指令为

38、: CLR C ; (CY) 0 , C3 例如: 设(A)=52H, (R0)=B4H 执行指令: CLR C ; (CY)0 , C3 SUBB A, R0 ; (A) (A)(CY)(R0) , 98 结果为: (A)=9EH, CY=1, AC=1, OV=1, P=1。,例2: 双字节无符号数相减(R0 R1)(R2 R3) (R4 R5)。R0、 R2、 R4存放16位数的高字节, R1、 R3、 R5存放低字节, 先减低8位, 后减高8位和低位减借位。 由于低位开始减时没有借位, 所以要先清零。 其编程如下: MOV A, R1 ; 取被减数低字节 , E9 CLR C ; 清借

39、位位 , C3 SUBB A, R3 ; 低字节相减 , 9B MOV R5, A ; 保存差低字节 , FD MOV A, R0 ; 取被减数高字节 , E8 SUBB A, R2 ; 两高字节差减低位借位 , 9A MOV R4, A ; 保存差高字节 , FC,4. 加1, 减1指令 加1指令共有如下5条指令, 助记符为INC。 INC A ; (A) (A)+1 , 04 INC direct ; (direct) (direct)+1 , 05 direct INC Ri ; (Ri) (Ri)+1 , 0607 INC Rn ; (Rn) (Rn)+1 , 080F INC DPT

40、R ; (DPTR) (DPTR)+1 , A3,减1指令有如下4条指令, 助记符为DEC。 DEC A ; (A) (A)1 , 14 DEC direct ; (direct) (direct)1 , 15 direct DEC Ri ; (Ri) (Ri)1 , 1617 DEC Rn ; (Rn) (Rn)1 , 181F,例如: 设(R0)=7EH, (7EH)=FFH, (7FH)=38H, (DPTR)=10FEH, 分析逐条执行下列指令后各单元的内容。 INC R0 ; 使7EH单元内容由FFH变为00H INC R0 ; 使R0的内容由7EH变为7FH INC R0 ; 使7

41、FH单元内容由38H变为39H INC DPTR ; 使DPL为FFH, DPH不变 INC DPTR ; 使DPL为00H, DPH为11H INC DPTR ; 使DPL为01H, DPH不变,5. 乘、 除法指令 乘、 除法指令为单字节4周期指令, 在指令执行周期中是最长的两条指令。 (1) 乘法指令,MUL AB,(B)(A)(B)158, (A)(A)(B)70,(CY)0,A4,乘法指令的功能是把累加器A和寄存器B中的两个8位无符号数相乘, 将乘积16位数中的低8位存放在A中, 高8位存放在B中。 若乘积大于FFH(255), 则溢出标志OV置1, 否则OV清0。 乘法指令执行后进

42、位标志CY总是清零, 即CY=0。 另外, 乘法指令本身只能进行两个8位数的乘法运算, 要进行多字节乘法还需编写相应的程序。 例如: 若(A)=4EH(78), (B)=5DH(93) 执行指令: MUL AB 结果为: 积为(BA)=1C56H(7254) FFH(255), (A)=56H, (B)=1CH, OV=1, CY=0, P=0。,例3: 利用单字节乘法指令进行双字节数乘以单字节数运算。 若被乘数为16位无符号数, 地址为M1和M1+1(低位先、 高位后), 乘数为8位无符号数, 地址为M2, 积存入R2、 R3和R4三个寄存器中。 (M1+1) (M1) (M2) R3 R4

43、 B A R2 R3 R4,参考程序如下: MOV R0, M1 ; 被乘数地址存于R0 MOV A, R0 ; 取16位数低8位 MOV B, M2 ; 取乘数 MUL AB ; (M1)(M2) MOV R4, A ; 存积低8位 MOV R3, B ; 暂存(M1)(M2)高8位 INC R0 ; 指向16位数高8位 MOVA, R0 ; 取被乘数高8位,MOV B , M2 ; 取乘数 MUL AB ; (M1+1)(M2) ADD A, R3 ; (A)+(R3)得(积)158 MOV R3, A ; (积)158存R3 MOV A, B ; 积最高8位送A ADDCA, 00H ;

44、 积最高8位+CY得(积)2316 MOV R2, A ; (积)2316存入R2 若上述程序执行前: (M1+1)=ABH, (M1)=CDH, (M2)=64H, 则执行后: (R2)=43H, (R3)=1CH, (R4)=14H。,(2) 除法指令 (A)(A)(B)之商,(B)(A)(B)之余数 (CY)0, (OV)0 除法指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数, 所得商存于累加器A中, 余数存于寄存器B中, 进位标志CY和溢出标志OV均被清零。 若除数B中的内容为0时, 除法运算没有意义, 结果为不定值, 此时溢出标志OV被置为1 , 即OV=1,

45、 而CY仍为0。,DIV A B ;, 84,例4: 利用除法指令把累加器A中的8位二进制数转换为3位BCD数, 并以压缩形式存放在地址M1、 M2单元中。 解: 累加器A中的8 位二进制数, 先对其除以100(64H), 商数即为十进制的百位数; 余数部分再除以10 (0AH), 所得商数和余数分别为十进制十位数和个位数, 即得到3位BCD数。 百位数放在M1中, 十位、 个位数压缩BCD数放在M2中, 十位与个位数的压缩BCD数的存放是通过SWAP和ADD指令实现的。 参考程序如下:,MOV B, 64H ; 除数100 送B DIV AB ; 得百位数 MOV M1, A ; 百位数存于M1中 MOV A, 0AH ; 取除数10 XCH A, B ; 上述余数与除数交换 DIV AB ; 得十位数和个位数 SWAP A ; 十位数存于A的高4位 ADD A, B ; 组成压缩BCD数 MOV M2, A ; 十、 个位压缩BCD数存M2 若上述程序执行前: (A)=A8H (168), 则执行后: (M1)=(01)BCD, (M2)=(68)BCD。,6. 十进制调整指令 若(A)309或(AC)=1, 则(A)30(A)30+06

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1