1 / 59

第二章 指令系统

第二章 指令系统. 内容提要 寻址方式 传送与交换指令 算术运算、逻辑运算指令 控制转移指令 位操作指令. 计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为 CPU 识别并执行的指令的集合就是该 CPU 的 指令系统 。 MCS-51 单片机汇编语言指令格式 : 操作符 目的操作数,源操作数. 操作符指明该指令完成什么操作; 操作数是指明该指令的操作对象。 目的操作数是存放结果的。 指令中操作数提供的方式称为 寻址方式 。. 指令中的常用符号

minty
Télécharger la présentation

第二章 指令系统

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 指令系统 内容提要 • 寻址方式 • 传送与交换指令 • 算术运算、逻辑运算指令 • 控制转移指令 • 位操作指令

  2. 计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为CPU识别并执行的指令的集合就是该CPU的指令系统。计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为CPU识别并执行的指令的集合就是该CPU的指令系统。 MCS-51单片机汇编语言指令格式: 操作符目的操作数,源操作数 操作符指明该指令完成什么操作; 操作数是指明该指令的操作对象。 目的操作数是存放结果的。 指令中操作数提供的方式称为寻址方式。

  3. 指令中的常用符号 • Rn: n=(0~7),表示当前工作寄存器R0~R7中的一个。 • Ri: i=(0、1),代表R0和R1寄存器中的一个,用作间接寻址寄存器。 • dir : 8 位直接字节地址(片内 RAM 和 SFR ) • #data: 8位立即数,即8位常数。可以为2进制(B)、 10进制、 16进制(H)、 字符(‘’)、

  4. data16: 表示16位立即数,即16位常数,取值范围为#0000H~#0FFFFH • addr16 : 表示16位地址 • addr11 : 表示11位地址 • rel : 相对偏移量(为一字节补码)用于相对转移指令中 • bit :位地址,在位地址空间中。 • $: 表示当前指令的地址。

  5. 2.1 寻址方式 1、立即寻址 指令中直接给出操作数的寻址方式。在51系列单片机的指令系统中,立即数用一个前面加 “#“号的8位数(#data,如#30H)或16位数(#data16,如#2052H)表示。立即寻址中的数,称为立即数。 例如指令:MOV A,#30H

  6. 41H 78H 41H 78H 40H 56H 40H 78H 2、直接寻址 操作数的地址直接出现在指令中。 寻址对象: ①内部数据存贮器:使用它的地址。 ②特殊功能寄存器:既可使用它的地址,也可以 直接使用寄存器名。 例:MOV A,40H ; A=56H 机器码 E540 MOV 40H,41H ; 机器码为854140 内部RAM (41H)→(40H) (40H)=(41H)=78H MOV P0,#45H ;45H→P0, P0为直接寻址的 SFR,其地址为 80H, 机器码为758045

  7. 3、寄存器寻址 操作数存放在寄存器中。 寻址对象:A,B,DPTR,R0~R7 。 B 仅在乘除法指令中为寄存器寻址,在其他指令中为直接寻址。 A 可以寄存器寻址又可以直接寻址,直接寻址时写作ACC 例如:MOV A,R0 ;R0→A,A、R0均为寄 存器寻址,机器码E8 MUL AB ;A*B→BA,A、B为寄 存器寻址,机器码A4

  8. MOV B,R0 ;R0→B,R0为寄存器寻 址,B为直接寻址 机器码 88F0,其中 F0为B的 字节地址(见表1-2) PUSH ACC ;A的内容压入堆栈 机器码C0E0

  9. 4、寄存器间址 操作数存放在以寄存器内容为地址的单元中。例如: MOV R0,#20H MOV @R0,A ;A→(20H) 地址的内部RAM MOVX A,@R1 ;外部RAM(地址为P2 R1 ) 的 内容→A MOVX @DPTR,A ;A→以DPTR内容为地址的 外部RAM

  10. 5、变址寻址 以DPTR或PC寄存器内容为基地址,和A的内容为相加形成操作数的地址。其中累加器A内容是可变的。 例如: MOVC A, @A+DPTR • 6、相对寻址 • 相对寻址是将程序计数器PC的当前值与指令第二字节给出的偏移量相加,从而形成转移的目标地址。 例如:JZ 61H

  11. 7、位寻址 对片内RAM中20H~2FH中的128个位地址及SFR中的可位寻址的位地址寻址。 例如: MOV C,20H;20H位的内容送CY标志 位,C称为位累加器。 MOV A,20H ;字节寻址,将内部 RAM中20H单元中的 内容送给累加器A。 以上两条指令均为寻址,究竟是位寻址还是字节寻址,根据两操作数类型一致的原则,由另一个操作数决定。

  12. 一、内部RAM、SFR之间的传送MOV指令 Rn #data dir @Ri dir @Ri MOV A , A A Rn, @Ri #data dir MOV dir , #data Rn A dir#data A dir #data MOV @Ri, MOV Rn ,

  13. 例 R1=20H,(20H)=55H, 指令MOV A,@R1执行后,A=55H。 • 例(40H)=30H,指令 MOV R7,40H 执行后,R7=30H。 • 例 MOV R7,#40H 执行后,R7=40H。 • 例 判断下列指令的正误: • MOV 29H,R7 MOV 25H,P1 • MOV 56H,#70H MOV 34H,28H • MOV R3,R7 MOV @R3,R7 • MOV R3,#D2H MOV #34H,28H • MOV A,#280H MOV P3,P1 √ √ × √ × √ √ × × √ • 编程将R3的内容送R1。 MOV A,R3 MOV R1,A

  14. 2、外部存储器和A累加器之间的传送 MOVC MOVX 程序 存储器 外部数据 存储器 A @Ri , A @DPTR , A A , @Ri A , @DPTR A , @A+PC A , @A+DPTR MOVX MOVC

  15. MOVX指令举例例: 实现片外数据存储器数据传送 (2000H)→(2100H)。 ; DPTR= 2000H MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,#2100H MOVX @DPTR,A ; A← X ; DPTR= 2100H ;(2100H)← X x 片外数据存储器不能直接寻址。下列为非法指令: MOVX A,2000H × MOVX 2100H,2000H ×

  16. 查表指令MOVC注:①只能从程序存储器读取数据到A累加器。②只能使用变址间接寻址方式 多用于查常数表程序,直接求取常数表中的函数值 1)DPTR为基址寄存器 MOVC A,@A+DPTR ;A←(A+DPTR) 查表范围为 64KB 程序存储器任意空间。 2)PC为基址寄存器 MOVC A,@A+PC ;A← (A+PC) 常数表只能在查表指令后 256B 范围内。

  17. 例查表法求 Y=X2。设 X(0≤X≤15)在片内 RAM 20H单元,要求将查表求 Y,存入片内 RAM 21H单元 1)用DPTR作基址寄存器 ORG 0100H SQU: MOV DPTR,#TAB ;确定表首地址 MOV A,20H ;取 X MOVC A,@A+DPTR ;查表求 Y=X2 MOV 21H,A ;保存Y RET ;子程序结束 … ;其它程序段 ORG 0200H ;常数表格首地址 TAB: DB 00,01,04,09,…,225 ;平方表

  18. 2)用PC作基址寄存器 指令地址 源程序 ORG 0100H ;程序起始地址 0100H SQU: MOV A,20H ;取X 0102H ADD A,#3 ;修正偏移量 0104H MOVC A,@A+PC ;查表求Y=X2 0105H MOV 21H,A ;存结果 0107H RET ;子程序结束 0108H TAB: DB 00,01,04 ;平方表 010BH DB 09,…,225 思考题当0≤X≤255时,如何用查表法编程求Y=X2

  19. (四)堆栈操作指令 入栈指令:PUSH dir ;SP←SP+1,(SP) ←(dir ) 出栈指令:POP dir ;(dir )←(SP),SP←SP-1 例:设A=02,B=56H,执行下列指令序列后,SP = ?A = ? ,B = ? ;设栈底 SBR:MOV SP,#30H PUSH Acc PUSH B MOV A,#0 MOV B,#01 … POP B POP Acc RET ;sp-2→sp [2eH] ;保护现场 堆栈操作示意: × × × × SP→ × × × × SP→ 02 × × × SP→ 56 02 × × × 56 SP→ 02 × × × 56 02 SP→ × ;恢复现场

  20. (三) 交换指令 实现片内RAM区的数据双向传送 1. 字节交换指令 XCH A,Rn ;A←→Rn XCH A,@Ri ;A←→(Ri) XCH A,Dir ;A ←→Dir 例设A= 29H,(2AH ) =38H 执行指令 XCH A,2AH 后, A= ? ,(2AH)= ? 29H 38H 习题 将片内RAM 60H单元与 61H单元的数据交换 XCH 60H,61H ←对吗?

  21. × ◎ ◎ × 2. 半字节交换指令 XCHD A,@Ri ;A0~3← (Ri)0~3 SWAP A ;A4~7←A0~3 A A

  22. 以A为目的操作数的算术、逻辑运算指令(24条)以A为目的操作数的算术、逻辑运算指令(24条) dir dir @Ri @Ri A A #data #data Rn Rn A A dir , dir #data #data 加 进位加 借位减 与 或 异或 ADD ADDC SUBB ANL ORL XRL Rn, @Ri #data dir A , 以dir为目的操作数逻辑运算指令(6条) 与 ANL 或 ORL 异或 XRL

  23. 00001111 • 10000110 • 10001111 • 00001111 • 10000110 • 10001001 算术类指令的操作意义非常明确,不一一赘述, 注意减指令只有带借位减,因此在多字节减法中, 最低字节作减法时,注意先清CY。 逻辑运算是按位进行的,两数运算的运算法则是: • 与:有“0”则“0”; • 或:有“1”则“1” • 异或:同为“0”, 异为“1”; 与“0”异或值不变:与“1”异或值变反。 逻辑指令常用于对数据位进行加工。 例:A=0FH, 执行ORL A,#86H 后 A=8FH 例:A=0FH, 执行XRL A,#86H 后 A=89H 例:A=0FH, 执行XRL A,#86H 后 A=06HH

  24. A Rn @Ri dir DPTR A Rn @Ri dir 加 1 指令: INC 减 1 指令: DEC 提问:没有DEC DPTR指令,怎么解决DPTR的减 1?

  25. 2.3.5 十进制调整指令 计算机完成二进制加法其和也为二进制,如果是十进制相加(即BCD码相加)想得到十进制的结果,就必须进行十进制调整(即BCD 码调整)。 调整指令: DA A ;将A中二进制相加和调整成BCD码 调整方法: 和低4位大于9或有半进位则低4位加6; 和的高4位大于9或有进位,则高4位加6。 指令根据相加和及标志自行进行判断,因此该指令应紧跟在加指令之后,至少在加指令和该指令之间不能有影响标志的指令。 DA A指令只对一个字节和调整,如为多字节相加必须进行多次调整。此指令不能对减法结果进行调整。

  26. 56H 17H 6dH 6 73H + + • 例2-13 完成56+17的编程。 • MOV A,#56H ;A存放BCD码56H • MOV B,#17H ;B存放BCD码17H • ADD A, B ;A=6dH • DA A ;A=73H • SJMP $

  27. 指令对标志位的影响有如下规律: • 1) 凡是对A 操作指令(包括传送指令)都将A中1个的奇偶反映到PSW的P标志位上。即A中奇数个“1”,P=1;偶数个“1”,P=0。 • 2) 传送指令、加 1、减 1 指令、逻辑运算指令不影响Cy、 OV、AC 标志位。 • 3) 加减运算指令影响标志位,乘除指令使Cy=0,当乘积大于255,或除数为0时,OV置1。 • 4) 对进位位Cy(指令中用C表示)进行操作的指令和大环移指令,显然会影响Cy。 • 具体指令对标志位的影响可参阅附录A。 • 标志位的状态是控制转移指令的条件,因此指令对标志位的影响应该记住。

  28. 例2:A= 9AH,R2= E3H,PSW= 0,执行指令 ADDC A,R2 后求: A= ,Cy= ,OV= ,AC= ,P= PSW= ? 7DH 1 1 0 0 10000100 = 84H 1001 1010 1110 0011 + 0 1 0111 1101 最高位与次高位相异或判断OV

  29. CY 移位指令(仅对 A ) A 设 10010110 1 01001011 A RR A RL A 00101101 A CY 0 A 11001011 RRC A CY CY 1 A 00101101 RLC A CY

  30. 乘除法指令 • 只能进行无符号的乘除法 • MUL AB ;A×B =BA • DIV AB ;A÷B→商在A中,余数在B中 • 乘除法指令影响溢出标志0V,但意义不同 • MUL AB;BA,OV=1表示结果B≠0 • DIV AB;A…B, 若源B=0, 则0V=1,除 ;法无意义

  31. DJNZ dir @Ri A #data Rn DJNZ 减 1 不等于零转移 DJNZ Rn , rel DJNZ dir , .rel 比较转移指令 CJNE A,dir , rel CJNE A , #data , rel CJNE Rn , #data , rel CJNE @Ri , #data , rel

  32. 2.4 控制转移指令 这一类指令的功能是改变指令的执行顺序,转到指令指示的新的PC地址执行。 MCS-51单片机的控制转移指令有以下类型: 无条件转移:无需判断,执行该指令就转移到目的地址。 条件转移:需判断标志位是否满足条件,满足条件转移到目的地址,否则顺序执行。 绝对转移:转移的目的地址用绝对地址指示,通常为无条件转移。 相对转移:转移的目的地址用相对于当前PC的偏差(偏移量)指示,通常为条件转移。 长转移或长调用:目的地址距当前PC 64KB地址范围内。 短转移或短调用:目的地址距当前PC 2KB地址范围。

  33. 1.长调用 LCALL addrl16 ;addr16→PC0~15 说明: (1)该指令功能是 ①保护断点,即当前PC(本指令的下一条指令的首地址)压入堆栈。 ②子程序的入口地址 addr16 送PC,转子程序执行。 (2)本指令为64KB地址范围内的调子程序指令,子程序可在64KB地址空间的任一处。 (3)本指令的机器码为三字节 12 addr16。

  34. 2.短调用 ACALL addr11 ;addr11→PC0~10 说明: (1)该指令的功能是 ①保护断点,即当前PC压入堆栈。 ② addrl11→PC0~10,而PC11~15保持原值不变。 (2)本指令为2KB地址范围的调子程序指令,子程序入口距当前PC不得超过2KB地址范围。 (3)本指令的机器码为二字节,设addr11的各位是a10a9a8…a2a1a0,则ACALL指令机 器码a10a9a810001a7a6a5a4a3a2a1a0,其中10001是ACALL指令的操作码。

  35. 例2-18 子程序调用指令ACALL在 程序存储器中的首地址为0100H,子程序入口地址为0250H。试确定能否使用ACALL指令实现调用?如果能使用,确定该指令的机器码。 解: 因为ACALL指令首地址在0100H,而ACALL是 2字节指令,所以下一条指令的首地址在0102H。0102H和0250H在同一2KB地址范围内,故可用ACALL调用。调用入口地址为0250H,ACALL指令的机器码形式为:0101000101010000B=5150H。

  36. 3.子程序返回指令 • RET ;从调用子程序返回。 功能:从栈顶弹出断点到PC。 • RETI ; 从中断服务程序返回。 功能:从栈顶弹出断点到PC,并恢复中断优先级状态触发器。

  37. 2.4.2 转移指令 1. 无条件转移指令 (1)短转移 AJMP addr11 ;addr11→PC0~10 说明: ①转移范围:本指令为2KB地址范围内的转移指令。对转移目的地址的要求与ACALL指令对子程序入口地址的要求相同。 ②机器码形式:本指令为2字节指令。设addr11的各位是a10a9a8…a2a1a0,则指令的机器码为a10a9a800001a7a6a5a4a3a2a1a0。

  38. (2)长转移 LJMP addr16 ;addr16→PC0~15 说明: ①本指令为64KB程序存储空间的全范围转移指令。转移地址可为16位地址中的任意值。 ②本指令为3字节指令02 addr16。 (3)间接转移 JMP @A+DPTR ;A+DPTR→PC 例 2-20 A=02H,DPTR=2000H, 指令JMP @A+DPTR执行后,PC=2002H。也就是说,程序转移到2002H地址单元去执行。

  39. 例 2-21 现有一段程序如下: MOV DPTR,#TABLE JMP @A+DPTR TABLE: AJMP PROC0 AJMP PROC1 AJMP PROC2 AJMP PROC2 根据JMP @A+DPTR指令的操作可知, 当A=00H时,程序转入到地址 PROC0 处执行; 当A=02H时,转到PROC1处执行…… 可见这是一段多路转移程序,进入的路数由A确定。因为AJMP指令是2字节指令,所以 A 必须为偶数。 以上均为绝对转移指令,下面介绍相对转移指令。

  40. (4)无条件相对转移 SJMP rel ;PC+rel→PC, 即As+2+rel→PC,机器码为80 rel 说明: As为源地址(本指令的首地址),该指令为2字节指令,执行本指令时 当前PC=As+2, rel 为转移的偏移量,转移可以向前转(目的地址小于源地址),也可以向后转(目的地址大于源地址),因此偏移量rel 是 1 字节有符号数,用补码表示(-128~+127),所以指令转移范围在离源地址As的-126~+129字节之间。

  41. 2. 条件转移指令 (1)累加器为零(非零)转移 JZ rel ;A=0 则转移(As+2+rel→PC) JNZ rel ;A≠0 程序顺序执行,机器码为60rel

  42. DJNZ dir @Ri A #data Rn DJNZ (2)减 1 不等于零转移 DJNZ Rn , rel ;Rn-1 DJNZ dir , .rel 本指令有自动减 1 功能。 (3)比较转移指令 CJNE A,dir , rel CJNE A , #data , rel CJNE Rn , #data , rel CJNE @Ri , #data , rel

  43. 说明: • ① CJNE指令都是3字节指令,作减操作,不回送结果,影响CY标志。 • ② 若第一操作数大于或等于第二 操作数,则标志CY=0。若第一操作数小于第二操作数,则CY=1。 • 这几条指令除实现两操作数相等与否的判断外,利用对CY的判断,还可完成两数大小的比较。

  44. 试说明以下一段程序运行后A中的结果。 MOV 23H,#0AH CLR A LOOP:ADD A,23H DJNZ 23H,LOOP SJMP $ 根据程序可知 A=10+9+8+7+6+5+4+3+2+1=55=37H

  45. 例 2-24 编写程序,要求读P1 端口上的信息,若不为55H,则程序等待,直到P1端口为55H时,程序才往下顺序执行。 程序: MOV A,#55H ;A=55H CJNE A,P1,$ ;P1≠55H,则程序循环执行本指令 … 在实际编程中,转移的目的地址不管是addr11、addr16、还是rel ,均是一符号地址表示的(如SJMP ABC,AJMP LOOP…),转移的类型是通过指令的操作符来决定的。

  46. 3。相对偏移量rel的求法 在相对转移中,用偏移量 rel 和转移指令所处的 地址值来计算转移的目的地址,rel 是 1 字节补码. 在填机器码时,需计算rel,下面介绍计算rel 的方法。 设 本条转移指令的首地址为As——源地址, 指令字节数为Bn——2字节或3字节, 要转移的目标地址为Ad——目的地址, 当前PC= As+ Bn 因为在执行本条指令时,PC 已经指向了下一条指令,见下图:

  47. Bn=3 Ad 0100 MN: ……. ….... As 0125 BF 05 rel CJNE R7,#06,MN 当前PC 0128 当前PC= As +Bn=0125+3=0128 于是 rel =Ad-当前PC =Ad-(As+Bn)= Ad - As - Bn • 在上例中 rel=Ad-当前PC =0100H-0128H=-28H -28求补得D8H

  48. 于是 rel=(Ad-As-Bn)补 这就是在已知源地址,目的地址和指令的长度时,计算rel 大小的公式。

  49. 例 2-25 MCS-51单片机指令系统中,没有停机指令,通常用短转移指令SJMP $ ($为本条指令的首地址)来实现动态停机的操作,试写出这条指令中机器码。 解: 查附录A ,SJMP rel 的指令码为80rel 据题意 本条指令的首地址 As=$,转移的目的地址是本条指令地址,即Ad=$ 该指令为两字节,即Bn=2, rel= (Ad-As-Bn)补= ($-$-2)补=(-2)补=FEH 所以SJMP $指令的机器码是80FEH。

  50. 例 2-26 计算下面程序中CJNE指令的偏移量。 LOOP:MOV A,P1 CJNE A,#55H,LOOP 解 由于MOV A,P1是2字节指令,故CJNE指令的首 地址是LOOP+2。又因为CJNE是3字节指令,于是 有:Ad=LOOP ,As=LOOP+2, Bn=3 rel=[LOOP-(LOOP+2)-3]补=[-5]补=FBH 所以CJNE A,#55H,LOOP的指令码为B455FBH。 2.4.3 空操作指令 NOP 机器码 00 该指令经取指,译码后不进行任何操作(空操作)而转到下一条指令,常用于生产一个机器周期的延时,或上机修改程序时作填充指令,以方便增减指令。

More Related