650 likes | 884 Vues
第 3 章 指令系统. 3-1 指令系统概述 3-2 寻址方式 3-3 89C51 单片机的指令系统. 3-1 指令系统概述. 一、指令、指令系统的概念. 指令是计算机内部执行的一种操作,供用户编程使用的一种命令。由构成计算机的硬件特性所决定,也就是说,不同的 CPU ,指令系统是不一样的。 计算机只能识别二进制代码。以二进制代码来描述指令功能的语言,称之为机器语言。 由于机器语言不便被人们识别、记忆、理解和使用,因此给每条机器语言指令赋予助记符号来表示,这就形成了汇编语言。 汇编语言是便于人们识别、记忆、理解和使用的一种指令形式,它和机器语言指令一一对应。
E N D
第3章 指令系统 3-1 指令系统概述 3-2 寻址方式 3-3 89C51单片机的指令系统
3-1 指令系统概述 一、指令、指令系统的概念 • 指令是计算机内部执行的一种操作,供用户编程使用的一种命令。由构成计算机的硬件特性所决定,也就是说,不同的CPU,指令系统是不一样的。 • 计算机只能识别二进制代码。以二进制代码来描述指令功能的语言,称之为机器语言。 • 由于机器语言不便被人们识别、记忆、理解和使用,因此给每条机器语言指令赋予助记符号来表示,这就形成了汇编语言。 • 汇编语言是便于人们识别、记忆、理解和使用的一种指令形式,它和机器语言指令一一对应。 • 计算机能够执行的全部操作所对应的指令集合,称为这种计算机的指令系统。
从指令是反应计算机内部的一种操作来看,指令系统全面展示出了计算机的操作功能,也就是它的工作原理。从指令是反应计算机内部的一种操作来看,指令系统全面展示出了计算机的操作功能,也就是它的工作原理。 • 从用户使用的角度来看,指令系统是供用户使用计算机功能的软件资源。要让计算机处理问题,首先要编写程序。 • 编写程序实际上是从指令系统中挑选一个指令子集的过程。因此,学习指令系统既要从编程使用的角度掌握指令的使用格式及每条指令的功能;又要掌握每条指令在计算机内部的微观操作过程,即工作原理,从而进一步加深对硬件组成原理的理解。
指令一般有功能、时间和空间三种属性。 功能属性是指每条指令都对应一个特定的操作功能。 时间属性是指一条指令执行所用的时间,一般用机器周期来表示。 空间属性是指一条指令在程序存储器中存储所占用的字节数。 上述三属性在本书的附录A 89C51指令表中均可查到。 这三种属性在使用中最重要的是功能,但时间、空间属性在有些场合也要用到。 如一些实时控制应用程序中,有时需要计算一个程序段的确切执行时间或编写软件延时程序,都要用到每条指令的时间属性。 在程序存储器的空间设计,或相对转移指令的偏移量计算时就要用到指令的空间属性。
指令的描述形式有两种:机器语言形式和汇编语言形式。现在描述计算机指令系统及实际应用中主要采用汇编语言形式。 • 采用机器语言编写的程序称之为目标程序。 • 采用汇编语言编写的程序称之为源程序。 • 计算机能够识别并执行的是机器语言。汇编语言程序不能被计算机直接识别并执行,必须经过一个中间环节把它翻译成机器语言程序,这个中间过程叫做汇编。 • 汇编有两种方式:机器汇编和手工汇编。机器汇编是用专门的汇编程序,在计算机上进行翻译。 • 手工汇编是编程员把汇编语言指令逐条翻译成机器语言指令。现在主要使用机器汇编,很少用到手工汇编。 #4
二、指令格式 • 汇编语言指令格式 [标号:] 操作码助记符 [目的操作数][,源操作数] [;注释] 换行表示一条指令结束。 例:LOOP: MOV A,#40H ;取参数 MOV——move传送 XCH——exchange交换 ANL——and logic与逻辑运算 XRL——exclusive or异或运算 MUL——Multiply乘法 RR——rotate right右循环 SJMP——short jump短跳转 RET——return 子程序返回 • 标号:指令的符号地址 • 操作码助记符:指明指令功能 • 操作数:指令操作对象,包括数据、地址、寄存器名及约定符号 • 注释行:说明指令在程序中的作用
01111110 00110010 01110101 01000000 01100100 • 机器语言指令格式 汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,指令表中可查出对应指令代码。 操作码 [操作数1] [操作数2] 有单字节、双字节和三字节指令。 举例: 汇编语言:机器语言: MOV A,R0 E8H MOV R6,#32H 7E 32H MOV 40H,#100H 75 40 64H 11101000
三、89C51指令系统 • 89C51单片机指令系统具有功能强、指令短、执行快等特点,共有111条指令。 • 从功能上可划分成数据传送、算术操作、逻辑操作、程序转移、位操作等五大类。 • 从空间属性上分为单字节指令(49条)、双字节指令(46条)和最长的三字节指令(只有16条)。 • 从时间属性上可分成单机器周期指令(64条)、双机器周期指令(45条)和只有乘、除法两条4个机器周期的指令。 • 89C51单片机的指令有:无操作数、单操作数、双操作数三种情况。
为了便于指令讲解,指令描述时用如下一些符号作约定: • Ri和Rn:表示当前工作寄存器区中的工作寄存器,i取0或1,表示R0或R1。n取0~7,表示R0~R7。 • #data:表示包含在指令中的8位立即数。 • #data16:表示包含在指令中的16位立即数。 • rel:以补码形式表示的8位相对偏移量,范围为-128~127,主要用在相对寻址的指令中。 • addr16和addr11:分别表示16位直接地址和11位直接地址。 • direct:表示直接寻址的地址。 • bit:表示可位寻址的直接位地址。 • (X):表示X单元中的内容。
0100 0000 0010 0000 0100 0000 A R0 40H 40H 3-2 寻址方式 3-2-1 操作数类型 位(b)─ 位寻址区中的一位二进制数据 字节(B)─ 8位二进制数据 字(W)─ 双字节数据,16位二进制数据 3-2-2 寻址方式 一、寄存器寻址方式 指令操作数为寄存器名,数据在寄存器中。 例:MOV A,R0 ;AR0 设指令执行前 A=20H,R0=40H, 执行指令后,A= ?,R0= ?
例:设存储器两个单元的内容如图所示, 执行指令 MOV A,40H后, A = ? 41H78H 40H56H 二、直接寻址方式 MOV A,40H ;A(40H) 指令操作数是存储器单元地址,数据在存储器单元中。 56H 三、立即寻址方式 指令中给出实际操作数据(立即数),一般用于为寄存器或存储器赋常数初值。 举例: 8位立即数: MOV A,#40H ;A40H 16位立即数:MOV DPTR,#2100H ;DPTR2100H 思考题: 直接寻址方式指令和立即寻址方式指令的形式有什么不同?
34H 40H 41H 67H 34H 40H 34H R0→ 四、寄存器间接寻址方式 指令的操作数为寄存器名,寄存器中为数据地址。 存放地址的寄存器称为间址寄存器或数据指针。 例:MOV A,@R0 ;A(R0) 设指令执行前 A=20H,R0=40H,地址为40H存储器单元内容如图所示。执行指令后, A= ? ,R0 = ? , (40H)= ?
2000H 12H 2008H 89H 2009H 12H 五、变址寻址方式 数据在存储器中,指令给出的寄存器中为数据的基地址和偏移量。 数据地址 = 基地址 + 偏移量。 例:MOVC A,@A+DPTR ;A(A+DPTR) 设指令执行前 A=09H,DPTR=2000H,存储器单元内容如图所示。 执行指令后,A= ? DPTR= ?
位寻址区 例:MOV C,40H ;Cy (位地址40H) 设指令执行前 Cy=1,位地址40H存储器单元如图,执行指令后,Cy= ? 28H 01100010 29H 11010111 六、相对寻址方式 相对寻址只出现在相对转移指令中,在介绍相对转移指令时再介绍。 七、位寻址方式 指令给出位地址。一位数据在存储器位寻址区。 0
3-3 89C51单片机的指令系统 3-3-1 数据传送指令 实现寄存器、存储器之间的数据传送。其中包括: 一、内部传送指令(片内RAM数据传送) 二、外部传送指令(片外RAM数据传送) 三、交换指令(片内RAM数据传送) 四、堆栈操作指令(片内RAM数据传送) 五、查表指令(ROM数据传送)
一、内部传送指令 实现片内RAM中数据传送。 指令格式:MOV 目的操作数,源操作数 寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间址 指令机器码: 11101rrr E8~EF 11100101 n E5n 1110011i E6、E7 01110100 d 74 d 10101rrr n 1010011i n 85 n1 n2 90 d1 d2 MOV A,Rn ;A←Rn,Rn=R0~R7 MOV A,direct ;A←(direct) MOV A,@Ri ;A←(Ri),Ri=R0、R1 MOV A,#data ;A←data MOV Rn, direct ;Rn←(direct) MOV @Ri, direct;(Ri)←(direct) MOV direct1,direct2 ;(direct 1)←(direct2) MOV DPTR,#data16 ;DPTR←data16 思考题:找出配对指令,实现反向传送。
例1:顺序执行下列指令序列,求每一步执行结果。例1:顺序执行下列指令序列,求每一步执行结果。 ;A= 30H ;(4FH)= 30H ;R0= 20H ;(20H)= 30H ;(21H)= 30H MOV A,#30H MOV 4FH,A MOV R0,#20H MOV @R0,4FH MOV 21H,20H 思考题: 用两种寻址方式实现,将片内RAM 60H单元的数据传送给累加器A。 解1:MOV A,60H 解2:MOV R0,#60H MOV A,@R0
说明: • 一条指令中不能同时出现两个工作寄存器:非法指令:MOV R1,R2 MOV R2,@R0 • 间址寄存器只能使用 R0、R1。非法指令: MOV A,@R2 • SFR区只能直接寻址,不能用寄存器间接寻址。非法指令: MOV R0,#80H MOV A,@R0 • 指令表:B:指令字节数,M:机器周期数 注意:只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。
二、外部传送指令 实现片外RAM和A之间的数据传送。 指令格式:MOVX 目的操作数,源操作数 寻址方式:片外RAM用寄存器间址方式。 • DPTR作16位数据指针,寻址64KB片外RAM空间 MOVX A,@DPTR ;A←(DPTR) MOVX @DPTR,A ;(DPTR)←A • Ri作8位数据指针,寻址256B片外RAM空间 MOVX A,@Ri ;A←(Ri) MOVX @Ri,A ;(Ri)←A 注意:片外RAM传送必须用MOVX。
例2:实现片外RAM数据传送(2000H)→(2100H)。 ; DPTR= 2000H ; A= X ; DPTR= 2100H ;(2100H)= X MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,#2100H MOVX @DPTR,A 片外数据存储器不能直接寻址。下列为非法指令: MOVX A,2000H MOVX 2100H,2000H 思考题:为什么对DPTR的数据传送使用内部传送指令? 思考题:将片外RAM 0000H单元的数据传送到片内RAM的60H单元。
片内RAM 地址 内容 2BH 35H 2AH 38H 29H … 20H 例3:设A= 29H,执行指令 XCH A,2AH后, A= ? (2AH)= ? 38H 29H 三、交换指令 实现片内RAM区的数据双向传送。 • 字节交换指令 XCH A,Rn ;A Rn XCH A,@Ri;A (Ri) XCH A,direct ;A (direct) 思考题:将片内RAM60H单元与61H单元的数据交换。 XCH 60H,61H ←对吗?
片内RAM 地址 内容 2BH 35H R1→ 2AH 38H R0→ … 例4:将片内RAM 2AH和2BH单元中的ASCII码转换成压缩式BCD码存入20H单元。 20H MOV A,#0 MOV R0,#2AH 非压缩BCD 压缩BCD码 XCHD A,@R0 0000 千位 SWAP A 千位 百位 0000 百位 MOV R1,#2BH 十位 个位 0000 十位 XCHD A,@R1 0000 个位 XCH A,20H • 半字节交换指令 XCHD A,@Ri ;A0~3(Ri)0~3 SWAP A ;A4~7 A0~3 85H 思考题:交换片内RAM 40H单元和41H单元的低半字节。
堆栈就好比堆放物品的库房,计算机中的堆栈是专门用来堆放暂存的数据的,它的堆放处就是存储器。而且堆放的数据采用“先进后出”的方式。堆栈就好比堆放物品的库房,计算机中的堆栈是专门用来堆放暂存的数据的,它的堆放处就是存储器。而且堆放的数据采用“先进后出”的方式。 四、堆栈操作指令 入栈指令:PUSH direct ;SPSP+1,(SP)(direct) 出栈指令:POP direct ;(direct) (SP),SPSP-1 例5:设A=02,B=56H,执行下列指令后, SP= ? ,A= ? ,B= ? 02H 56H 30H SBR: MOV SP,#30H ;设栈底 PUSH A PUSH B MOV A,#0 MOV B,#01 … POP B POP A × × × SP→ 02 × × × 56H 02H SP→ × × × × × SP→ × × × SP→ 56H 02 × × × 56H SP→02 × × × SP→ 56H 02 × × × SP→ 56H 02 × 注意:89C51的堆栈只能设在片内RAM中
五、查表指令 实现从程序存储器(ROM)读取数据到A累加器,只能使用变址间接寻址方式。 多用于查常数表程序,可直接求取常数表中的函数值。 • DPTR为基址寄存器 • MOVC A,@A+DPTR ;A(A+DPTR) • 查表范围为 64KB 程序存储器任意空间,称为远程查表指令 • PC为基址寄存器 • MOVC A,@A+PC ;A(A+PC) • 常数表只能在查表指令后256B范围内,称为近程查表指令
例6:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求将查表求Y,存入片内RAM的21H单元。例6:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求将查表求Y,存入片内RAM的21H单元。 • ORG 1000H SQU: MOV DPTR,#TAB ;确定表首地址(基地址) MOV A,20H ;取X(偏移量) MOVC A,@A+DPTR ;查表求Y=X2 MOV 21H,A ;保存Y RET ;子程序结束 … ;其它程序段 ORG 3000H ;常数表格首地址 TAB: DB 00,01,04,09,…,225 ;平方表
指令地址源程序 ORG 1000H ;程序起始地址 1000H SQU: MOV A,20H ;取X 1002H ADD A,#3 ;修正偏移量 1004H MOVC A,@A+PC;查表求Y=X2 1005H MOV 21H,A ;存结果 1007H RET ;子程序结束 1008H TAB: DB 00,01,04 ;平方表 100BH DB 09,…,225 思考题:当0≤X≤255时,如何用查表法编程求Y=X2。
习题:找出指令错误并改正: • MOV A,#1000H ;A←1000H • MOVX A,1000H ;A←(1000H)片外RAM • MOVC A,1000H ;A←(1000H)片外ROM • MOVX 60H,A ;片外RAM(60H)←A • MOV R0,60H ;片内RAM:(61H)←(60H) MOV 61H,@R0 • XCH R1,R2 ;R1←→R2 • MOVX DPTR,#2000H ;DPTR←2000H • MOVX 60H,@DPTR ;片内RAM←片外RAM #4
一、MCS-51 的 PSW 为标志寄存器。其格式如下: C y AC F0 RS1 RS0 OV — P 3-3-2算术运算指令 1.标志位(自动设置状态) 与数传指令不同,多数算运指令会影响标志位的状态,即CPU执行算运指令后,根据数据操作情况自动设置标志位的状态。 • Cy:进位标志位,保存运算后最高位的进位/借位状态,当有进位/借位,Cy=1,否则Cy=0。 • AC:辅助进位标志位,保存低半字节的进位/借位状态,当D3产生进位/借位,AC=1,否则AC=0。用于十进制调整。 • OV:溢出标志位,OV=C7C6,补码运算产生溢出OV=1,否则OV=0。 • P:奇偶标志位,反映累加器A中数据的奇偶性。当1的个数为奇数,P=1,否则P=0。
RS1 RS0 工作寄存器 0 0 0区 0 1 1区 1 0 2区 1 1 3区 例8:复位后,设置使用工作寄存器3区,其余标志位不变。 C y AC F0 RS1 RS0 OV — P • 用户选择位(编程设置状态) • F0:用户自定义标志位。 • RS1、RS0:工作寄存器区选择位。 • 复位时,PSW=00H 解:MOV PSW,# 18H
0011 1011 + 0011 1011 0111 0110 C y AC F0 RS1 RS0 OV — P 1 1 76H 0 0 二、加减乘除运算 • 不带进位加法:ADDA,源操作数 • 源操作数:Rn/direct/@Ri/#data • 影响Cy、OV、AC、P 1. 加法指令 如:ADD A,R2 ;A←A+R2 例1:A=3BH,PSW=0,执行指令 ADD A,#3BH 求:A= , Cy= , OV= , AC= , P= , PSW= ? 01000001= 41H
1001 1010 1110 0011 + 0 1 0111 1101 C y AC F0 RS1 RS0 OV — P • 带进位加法: ADDC A,源操作数 • 源操作数:Rn/direct/@Ri/#data • 影响Cy、OV、AC、P 如:ADDC A,R2 ;A←A+R2+Cy 例2:A= 9AH,R2= E3H,PSW= 0, 执行指令ADDC A,R2后求: A= ,Cy= , OV= , AC= , P= , PSW= ? 7DH 1 1 0 0 10000100 = 84H
RAM 片内 地址 内容 46H Z H 45H Z M 44H Z L 43H Y H 42H Y L 41H X H 40H X L 例:设双字节数 X 存在片内RAM 41H、40H单元,Y存在42H、43H单元,编程求 Z=X+Y,并存入片内RAM单元44H、45H、46H。 带进位加法指令ADDC用于多字节运算 ;取被加数低字节 ;加上加数低字节 ;保存和的低字节 ;取被加数高字节 ;加上加数高字节 ;保存和的高字节 ;求高字节进位 ;子程序结束 ADDS:MOV A,40H ADD A,42H MOV 44H,A MOV A,41H ADDC A,43H MOV 45H,A MOV A,#0 ADDC A,#0 MOV 46H,A RET
2.带借位减法指令:SUBB A,源操作数 • 源操作数:Rn/direct/@Ri/#data • 影响Cy、OV、AC、P 如:SUBB A,R2 ;A←A-R2-Cy 例:A= 5AH,R2= 5AH,Cy= 0, 执行下列指令SUBB A,R2 求: A= ,Cy= ,OV= ,P= ,AC= ? 00 0 0 0 0 注意:减法指令一定是带借位减。
RAM 片内 地址 内容 45H Z H 44H Z L 43H Y H 42H Y L 41H X H 40H X L 例:编程求双字节减法。设双字节数 X 存在片内RAM 41H、40H单元,Y存在42H、43H单元,计算Z=X-Y(X≥Y),并存入片内RAM单元44H、45H。 ;CY清0 ;取被减数低字节 ;减去减数低字节 ;保存减的低字节 ;取被减数高字节 ;减去减数高字节 ;保存减的高字节 ;子程序结束 SUBS:CLR C MOV A,40H SUBB A,42H MOV 44H,A MOV A,41H SUBB A,43H MOV 45H,A RET
增1、减1指令 • 增1指令:INC单操作数 • 单操作数:A/Rn/direct/@Ri/DPTR • 不影响标志位状态 • 如:INC R2 ;R2←R2+1 • INC DPTR ;DPTR←DPTR+1 • 减1指令: DEC单操作数 • 单操作数: A/Rn/direct/@Ri • 不影响标志位状态 • 如:DEC R2 ;R2←R2-1 • 注意:DEC DPTR指令没有
乘除指令 DIV AB ;A÷B,A←商,B←余数,Cy←0, ;当除数B=0,OV←1;B≠0,则OV←0 MUL AB ;BA←A×B,Cy←0, ;当积高字节B=0,OV←0;B≠0,则OV←1 例:A= 96(60H),B= 192(C0H),执行指令 MUL AB 后, 求:A= , B= , Cy= , OV= , P= ? 解:96 ×192 = 18432(4800H) 00H 48H 0 1 0 例:A= 156(F6H),B= 13(0DH),执行指令 DIV AB 后 求:A= ,B= ,Cy= ,OV= ,P= ? 解:156 ÷ 13 = 18(12H),余数= 12(0CH)。 12H 0CH 0 0 0
BCD调整指令:DA A 在进行BCD码运算时,该指令跟在ADD和ADDC之后,对A中的相加结果进行自动修正,如: 十进制加法: ADD A,源操作数 DA A 带进位十进制加法:ADDC A,源操作数 DA A 修正的过程是: 若(A0~3)>9或AC=1,则(A0~3)+6→A0~3 若(A4~7)>9或CY=1,则(A4~7)+6→A4~7
23H 01H 0101 0110 + 0110 0111 1011 1101 + 0110 0110 1 0010 0011 例:将30H和31H中的两个十进制数相加,结果放在32H(低)和33H(高)中。 本题显然是BCD码加法编程。MOV A,30H ADD A,31H DA A MOV 32H,A MOV A,#00H MOV ACC.0,C MOV 33H,A 分析:
RL A ;A循环左移一位 RR A ;A循环右移一位 RLC A ;带Cy循环左移一位 RRC A ;带Cy循环右移一位 3-3-3 逻辑运算指令 一、单操作数指令(以A累加器为操作数) • A清0指令: CLR A ;A←0 • A取反指令: CPL A ;A←/A • 循环移位指令: • 8位循环指令: • 9位循环指令:
RL A RLC A 例:设 A=10000101,Cy= 0,执行下列指令后,问A与Cy的变化:CPL A ;A= ,Cy=RL A; A= ,Cy=RLC A; A= ,Cy= 01111010 0 11110100 0 11101000 1
Cy R5 Cy R6 0 用9位循环指令实现多字节移位 例:编程将寄存器 R6R5 中的双字节数X左移一位, 设R6= 55H ,R5= AAH。 CLR C MOV A,R5 RLC A MOV R5,A MOV A,R6 RLC A MOV R6,A ;Cy=0 ;R6=01010101,R5=10101010,Cy=0 ;R6=01010101,R5=01010100,Cy=1 ;R6=10101011,R5=01010100,Cy=0 思考题:如何将寄存器R6R5中的双字节数X右移一位。
二、双操作数逻辑运算指令(对位逻辑运算) ANL 操作数1,操作数2;“对位与”ORL 操作数1,操作数2 ;“对位或”XRL 操作数1,操作数2;“对位异或” 三组指令中的操作数1,操作数2形式相同,共6种: A,Rn A,direct A,@Ri A,#data direct,A direct,#data
例:A=01××××××B,×表示随机状态,为1或0,执行下述一组指令后A的值如何? XRL A,#0C0H ;将累加器A的内容D7、D6取反 ORL A,#03H ;将累加器A的内容D1、D0置1 ANL A,#0E7H ;将累加器A的内容D4、D3清0 解 :执行上述指令后,A=10×00×11B 思考题:1.如何将累加器A中的数据高4位清0,低位不变?2.如何将寄存器R2中的数据奇数位取反,偶数位不变? 第3章作业:5、6 、9、16、18、19、20、30、32、34
3-3-4 控制转移指令 转移指令通过改写PC的当前值,从而改变CPU执行程序的顺序,使程序发生跳转。 • 按转移条件分类: • 无条件转移:执行无条件转移指令,程序无条件转移到指定处。 • 条件转移:指令中给出转移条件,执行指令时,先测试条件,若满足条件,则程序发生转移,否则仍顺序执行程序。
1000 H SJMP 02 1002H 1004 H • 按转移方式分类: • 绝对转移:指令给出转移目标的绝对地址 addr16, 执行指令后,PCaddr16。 例: 地址 源程序 1000H LJMP 2000H 1003H … … 2000H … ;转移目标指令 • 相对转移:指令给出转移目标与转移指令的相对偏移量rel,执行指令后,PCPC + rel 。 例: 地址 源程序 1000H SJMP 02 … 1004H … ;转移目标指令
一、无条件转移指令 • 长转移指令: • LJMP addr16;PC addr16 • 指令机器码:02 ,a15~a8 , a7~a0 • 指令转移范围:64KB • 短转移指令: • AJMP addr11 ;PCPC+2 ;PC10~0addr11 • ;PC15~11不变 • 指令机器码:a10~a8 00001,a7~a0 • 指令转移范围:2KB • 转移时要求转移前后保持 PC15~11不变。
相对转移指令: • SJMP rel ;PCPC+2,PCPC+rel • 指令机器码: 80H,rel • 相对偏移量 rel为8位补码。 • 指令转移范围:前128~后127字节 编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。LJMP NEXT/AJMP NEXT/SJMP NEXT … NEXT: 相对偏移量 rel 的计算式: rel = 目标地址 -(转移指令地址+指令字节数2) = 目标地址 - PC当前值
例1:计算转移指令的相对偏移量 rel ,并判断是否超出转移范围。 指令地址 源程序 2130H SJMP NEXT … 2150H NEXT: MOV A,R2 解: 相对偏移量 = 2150H -(2130H+2)= 001EH, 只取低8位:rel = 1EH 指令机器码:80 1E 例2:求原地踏步指令的指令代码 HERE: SJMP HERE ;等同与 SJMP $ 解:相对偏移量 = HERE -(HERE+2)= -2,-2的补码为FEH。 rel = FEH 指令代码为:80 FE
KEY: MOV DPTR,#KTAB ;DPTR放散转表首址KTAB MOV A,40H ;取键号X ADD A,40H ;键号X*2,作为偏移量 JMP @A+DPTR ;查表实现散转 KTAB: AJMP FUNC0 ;所在地址KTAB+0 AJMP FUNC1 ;所在地址KTAB+2 AJMP FUNC2 ;所在地址KTAB+4 … FUNC0: … ;0号功能键程序 FUNC1: … ;1号功能键程序 FUNC2: … ;2号功能键程序 … 散转指令表 • 间接转移指令(多分支转移指令) • JMP @A+DPTR ;PCA+DPTR,转移范围64KB。 应用:处理功能键。要求不同功能键执行不同程序段。设每个功能键对应一个键号X(0≤X≤FH),设X已存入片内RAM的40H单元中。若X=0,则执行程序段FUNC0;若X=1,则执行程序段FUNC1…。 #4
二、条件转移指令 条件转移可形成程序的分支,赋予计算机判断决策能力。 转移条件: • 标志位的状态 • 位地址中的状态 • 判零转移指令 • JZ rel ;PC←PC+2, • ;若A=00H,PC←PC+rel(转移) • ;若A≠00H,PC不变(不转移) JNZ rel ;PC←PC+2 ;若A≠00H,PC←PC+ rel(转移) ;若A=00H,PC不变(不转移)