第9讲 控制转移类指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解:根据短转移指令功能,如下关系成立。 根据短转移指令功能,如下关系成立。 目标转移地址=源地址+ + 目标转移地址=源地址+2+rel rel=目标转移地址-源地址-2 目标转移地址-源地址- 目标转移地址 =1000H-1017H-02H =-19H Rel应采用补码表示 应采用补码表示 为此rel= 为此 =[19H]补=E7H
该指令执行后,程序转移的目的地址是由AJMP指令所在位置 的地址PC值加上该指令字节数2,构成当前PC值。取当前PC值的 高5位与指令中提供的11位直接地址形成转移的目的地址,即
转移目的地址(PC)
PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
(2wk.baidu.com比较转移指令 比较转移指令
其一般格式为: 比较转移指令共有 4 条, 其一般格式为 CJNE 目的操作数, 源操作数, 目的操作数 源操作数 rel
这组指令是先对两个规定的操作数进行比较, 这组指令是先对两个规定的操作数进行比较 根据比较的结 果来决定是否转移到目的地址。 果来决定是否转移到目的地址。 4 条比较转移指令如下 条比较转移指令如下: CJNE A, #data , rel CJNE A, direct, rel ; B4 data ; B5direct rel rel rel rel
终止结束指令又称为停机指令。该指令通常写成: 终止结束指令又称为停机指令。该指令通常写成: HERE : SJMP HERE SJMP $
10、AJMP(绝对转移指令 、 绝对转移指令) 绝对转移指令 AJMP的机器码是由11位直接地址addr11和指令操作码 00001,按下列分布组成的:
a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0
AJMP TAB1; 当(A)=0时转 时转TAB1执行 时转 执行 AJMP TAB2; 当(A)=2时转 时转TAB2执行 时转 执行 AJMP TAB3; 当(A)=4时转 时转TAB3执行 时转 执行
13、调用和返回指令 、
子程序调用指令有长调用和绝对调用两条, 子程序调用指令有长调用和绝对调用两条,它们都是双周期 指令。 指令。
LCALL和ACALL指令类似于转移指令 和 指令类似于转移指令LJMP和AJMP,不 指令类似于转移指令 和 , 同之处在于它们在转移前要把执行完该指令的PC内容自动压入 同之处在于它们在转移前要把执行完该指令的 内容自动压入 堆栈后,才将子程序入口地址 堆栈后,才将子程序入口地址addr16(或addr11)送PC,实现转 或 送 , 移。 LCALL与LJMP一样提供 位地址,可调用 KB范围内 与 一样提供16位地址 一样提供 位地址,可调用64 范围内 的子程序。由于该指令为 字节 字节, 的子程序。由于该指令为3字节,所以执行该指令时首先应执行 (PC)←(PC)+3,以获得下一条指令地址,并把此时的PC内容压 ,以获得下一条指令地址,并把此时的 内容压 入堆栈(先压入低字节,后压入高字节 作为返回地址 作为返回地址, 入堆栈 先压入低字节,后压入高字节)作为返回地址,堆栈指针 先压入低字节 SP加2指向栈顶,然后把目的地址 加 指向栈顶 然后把目的地址addr16送入 。该指令执行 指向栈顶, 送入PC。 送入 不影响标志位。 不影响标志位。
第九讲
一、授课内容:第三章 80C51单片机的指 令系统 授课内容: 单片机的指 二、授课目的:掌握控制转移类指令和位操作的基 授课目的: 本语句,功能和应用。 本语句,功能和应用。 难点: 三、重点/难点 控制转移类指令的功能和应用 重点 难点
9、相对转移指令SJMP 、相对转移指令
SJMP rel SJMP又称为短转移指令 双字节指令 指令的操作数是相对 又称为短转移指令, 双字节指令, 又称为短转移指令 地址rel。 由于rel是带符号的偏移量 是带符号的偏移量, 地址 。 由于 是带符号的偏移量 所以程序可以无条件向前或 向后转移, 转移的范围是在SJMP指令所在地址 值(源地址) 指令所在地址PC值 源地址) 向后转移 转移的范围是在 指令所在地址 加该指令字节数2的基础上 以-128~+127 为偏移量(256 个单元) 为偏移量( 个单元) 加该指令字节数 的基础上, 的基础上 ~ 的范围内实现相对短转移, 的范围内实现相对短转移 即: 目的地址=源地址 目的地址 源地址+2+rel 源地址
从上述两条指令的功能操作看, 从上述两条指令的功能操作看,都是从堆栈中弹出返回地 址送PC,堆栈指针减 ,但它们是两条不同的指令。 址送 ,堆栈指针减2,但它们是两条不同的指令。其有下面 两点不同: 两点不同: (1) 从使用上,RET指令必须作子程序的最后一条指令; 从使用上, 指令必须作子程序的最后一条指令; 指令必须作子程序的最后一条指令 RETI必须作中断服务程序的最后一条指令。 必须作中断服务程序的最后一条指令。 必须作中断服务程序的最后一条指令 (2) RETI指令除恢复断点地址外,还恢复CPU响应中断时 指令除恢复断点地址外,还恢复 指令除恢复断点地址外 响应中断时 硬件自动保护的现场信息。执行 指令后, 硬件自动保护的现场信息。执行RETI指令后,将清除中断响应 指令后 时所置位的优先级状态触发器, 时所置位的优先级状态触发器,使得已申请的同级或低级中断 申请可以响应; 指令只能恢复返回地址。 申请可以响应;而RET指令只能恢复返回地址。 指令只能恢复返回地址
ACALL与AJMP一样提供11位地址,只能调用与PC在同一2 KB范围内的子程序。由于该指令为2字节指令,所以执行该指令 时应执行(PC)←(PC)+2以获得下一条指令地址,并把该地址压入 堆栈作为返回地址。该指令机器码的构成也与AJMP类似,只不 过操作码第一字节其高半字节的最后一位是1,机器码的组成如 下:
14、条件转移指令 、
(1)判零条件转移指令 判零条件转移指令 判零条件转移指令以累加器A的内容是否为 作为转移的条 判零条件转移指令以累加器 的内容是否为0作为转移的条 的内容是否为 指令是为0转移 则顺序执行; 指令是不为0 件。JZ指令是为 转移,不为 则顺序执行;JNZ指令是不为 指令是为 转移,不为0则顺序执行 指令是不为 转移, 0则顺序执行 累加器A的内容是否为 则顺序执行。 的内容是否为0, 转移,为0则顺序执行。累加器A的内容是否为0,是由这条指 令以前的其它指令执行的结果决定的, 令以前的其它指令执行的结果决定的,执行这条指令不作任何 运算,也不影响标志位。 运算,也不影响标志位。
又如: 指令地址(PC)=2FFFH。 又如 若AJMP指令地址 指令地址 。 执行指令: 执行指令 AJMP 0FFH; ;
(PC) ← (PC)+2=3001H, (PC)10~0← 00011111111 ~ 结果为: 转移目的地址 (PC)=30FFH , 程序向后转向 结果为 30FFH单元开始执行。 单元开始执行。 单元开始执行
12、间接转移JMP 、间接转移
JMP称为间接长转移指令。 它是以数据指针 称为间接长转移指令。 它是以数据指针DPTR的内容为基 称为间接长转移指令 的内容为基 以累加器A的内容为相对偏移量 的内容为相对偏移量, 址, 以累加器 的内容为相对偏移量 在 64 KB范围内可无条件 范围内可无条件 转移的单字节指令。 转移的单字节指令。 该指令的特点是转移地址可以在程序运行 中加以改变。 中加以改变。 例如: 根据累加器A的数值 转不同处理程序的入口。 的数值, 例如 根据累加器 的数值 转不同处理程序的入口。 MOV DPTR, #TABLE JMP TABLE: @A+DPTR ; 表首址送 表首址送DPTR ; 依据 值转移 依据A值转移
用汇编语言编程时, 指令中的相对地址rel往往用欲转移至 用汇编语言编程时 指令中的相对地址 往往用欲转移至 的地址的标号(符号地址)表示, 能自动算出相对地址值; 的地址的标号(符号地址)表示 能自动算出相对地址值 但人 工将程序翻译成机器代码时, 需自己计算相对地址rel。 工将程序翻译成机器代码时 需自己计算相对地址 。 rel的计算公式如下 的计算公式如下: 的计算公式如下 rel=目标转移地址-源地址-2 目标转移地址-源地址- 目标转移地址 例如: 若转向215CH去执行程序 则: 去执行程序, 例如 设(PC)=2100H, 若转向 ) 去执行程序 rel=(215CH-2100H)-2H=5AH - -
a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0
被调用子程序的目的地址也是由执行 ACALL指令的当前PC 值的高5位与指令中提供的11位直接地址形成。
返回指令共两条: 返回指令共两条:一条是对应两条调用指令的子程序返回指 令RET,另一条是对应从中断服务程序的返回指令 ,另一条是对应从中断服务程序的返回指令RETI。 。
11、长转移指令LJMP 、长转移指令
LJMP 称为长转移指令 三字节指令 提供 16 位目标地址 称为长转移指令, 三字节指令, addr16。 。 例如: 在程序存储器0000H单元存放一条指令 单元存放一条指令: 例如 在程序存储器 单元存放一条指令 LJMP 3000H ; (PC) ← 3000H, 02 30 00 H 则上电复位后程序将跳到3000H 单元去执行用户程序。 单元去执行用户程序。 则上电复位后程序将跳到
例题:今有如下程序,请计算SJMP START 指令码中rel。 例题:今有如下程序,请计算 指令码中 。 ORG 1000H 1000H START : MOV A ,#01H 1002H MOV R0 ,A 1003H LOOP : MOV DPTR ,#0CF01H . . . 1017H SJMP START . . . END
CJNE @Ri, #data, rel ; B6~B7data ~ CJNE Rn, #data, rel ; B8~Bfdata ~
由于 11 位地址的范围是 00000000000~11111111111, 即 2 ~ KB范围 而目标地址的高 5 位是由 当前值固定的 所以程序可 范围, 位是由PC当前值固定的 当前值固定的, 范围 转移的位置只能是和PC当前值在同一 的范围之内。 转移的位置只能是和 当前值在同一 2 KB的范围之内。 本指 的范围之内 令转移可以向前也可以向后, 指令执行后不影响状态标志位。 令转移可以向前也可以向后 指令执行后不影响状态标志位。 例如: 指令地址(PC)=2300H。 例如 若AJMP指令地址 指令地址 。 执行指令: AJMP 0FFH; 执行指令 (PC) ← (PC)+2=2302H, (PC)10~0← 00011111111 ~ 结果为: 结果为 转移目的地址 (PC)=20FFH , 程序向前转向 20FFH 单元开始执行。 单元开始执行。
例如:片外 为始址的数据块以零为结束标记, 例如:片外RAM中DATA1为始址的数据块以零为结束标记,试 中 为始址的数据块以零为结束标记 将之传送到片内RAM首地址为 首地址为DATA2的存储区中。 的存储区中。 将之传送到片内 首地址为 的存储区中 ORG 0500H
MOV R0,#DATA1 , MOV R1,#DATA2 , LOOP: MOVX A,@R0 A, JZ DONE MOV @R1,A , INC R0 INC R1 SJMP LOOP DONE: SJMP $ END ;循环取数 ;R0作为外部数据块的地址指针 作为外部数据块的地址指针 ;R1作为内部数据块的地址指针 作为内部数据块的地址指针 数据送入A ;取外部RAM数据送入A 取外部RAM数据送入 ;数据为零则终止传送 ;数据传送至内部RAM 单元 数据传送至内部 ;修改指针,指向下一数据地址 修改指针,