1 / 28

控制转移指令 :

控制转移指令 : 控制转移指令共有 17 条 , 不包括按布尔变量控制程序转移指令(见表 3.5 )。其中有 64 KB 范围内的长调用、 长转移指令 ; 有 2 KB 范围内的绝对调用和绝对转移指令 ; 有全空间的长相对转移及一页范围内的短相对转移指令 ; 还有多种条件转移指令。由于 MCS -51 提供了较丰富的控制转移指令 , 因此在编程上相当灵活方便。这类指令用到的助记符共有 10 种 : AJMP 、 LJMP 、 SJMP 、 JMP 、 ACALL 、 LCALL 、 JZ 、 JNZ 、 CJNE 、 DJNZ 。.

dahlia
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. 控制转移指令: 控制转移指令共有 17 条, 不包括按布尔变量控制程序转移指令(见表 3.5)。其中有 64 KB范围内的长调用、 长转移指令; 有 2 KB范围内的绝对调用和绝对转移指令; 有全空间的长相对转移及一页范围内的短相对转移指令; 还有多种条件转移指令。由于MCS -51 提供了较丰富的控制转移指令, 因此在编程上相当灵活方便。这类指令用到的助记符共有 10 种: AJMP、LJMP、SJMP、JMP、ACALL、LCALL、JZ、JNZ、CJNE、DJNZ。

  2. 表 3.5 控 制 转 移 指 令

  3. 一、 无条件转移指令 1. 长跳转指令 LJMP addr16;PC←addr16 功能: 将 16 位目标地址addr16 装入PC, 程序无条件转向指定的目标地址。 转移范围:可以在 64 KB程序存储器地址空间的任何地方, 不影响任何标志。

  4. 2. 绝对转移指令 AJMP addr11; PC←(PC)+2, (PC)10~0 ←addr11 这是2KB范围内的无条件跳转指令. 功能: 先将PC+2, 然后将addr11送入PC10~PC0, 而PC15~PC11保持不变。   这样得到跳转的目的地址。需要注意的是, 目标地址与AJMP后面一条指令的第一个字节必须在同一个 2 KB区域的存储器区内。

  5. 例:分析下面的绝对转移指令的执行情况 1234H:AJMP 0781H ; 指令执行前:(PC)=1234H, 取指后:(PC)=1236H 0001001000110110(1236H) 0000011110000001 (0781H) 1 7 8 1

  6. 3. 相对转移指令 SJMP rel; PC←(PC)+2, pc ← (pc)+rel 功能: 先将 PC+2, 再把指令中带符号的偏移量加到PC上, 得到跳转的目标地址送入PC。 

  7. 4. 散转指令 JMP @A+DPTR; pc ← (A)+(DPTR) 功能: 把累加器 A中的8位无符号数与数据指针中的16 位数相加, 结果作为下条指令的地址送入PC.   不改变累加器 A和数据指针DPTR的内容, 也不影响标志。 利用这条指令能实现程序的散转。

  8. 0 1 2 3 例:设累加器A中存有用户从键盘输入的值0~3,键处理程序分别放在KPRGO、KPRG1、KPRG2、KPRG3处,试编写程序,根据用户输入的键值,转入相应的键处理程序。 键盘如右图: 按各键可以依次产生方波、三角波、锯齿波、正弦波

  9. 解:  MOV DPTR,#JPTAB;转移指令表首地址送入DPTR RL A      ;键值乘2 JMP @A+DPTR JPTAB  :AJMP KPRG0 JPTAB+2:AJMP KPRG1 JPTAB+4 :AJMP KPRG2 JPTAB+6 :AJMP KPRG3 KPRGO: (产生方波的程序) . . . KPRG1: (产生三角波的程序) . . .

  10. KPRG2: (产生锯齿波的程序) . . . KPRG3: (产生正弦波的程序) . . .

  11. 二、 条件转移指令 • JZ rel; 若(A)= 0 转移,PC←(PC)+2+rel • ;若(A)≠0 按顺序执行,PC←(PC)+2 • JNZ rel;若(A)≠0 转移,PC ← (PC)+2+rel • ;若(A)= 0 按顺序执行, PC←(PC)+2 

  12. 功能: 这类指令是依据累加器A的内容是否为 0 的条件转移指令。条件满足时转移, 条件不满足时则顺序执行下面一条指令。 转移范围:转移的目标地址在以下一条指令的起始地址为中心的 256 个字节范围之内(-128~ +127)。

  13. 三、 比较转移指令 • 在MCS - 51 中没有专门的比较指令, 但提供了下面 4 条比较不相等转移指令: • CJNE A, direct, rel • ;若(A) > data,则PC ←(PC)+3+rel,CY ←0 •    ;若(A) < data,则PC ←(PC)+3+rel,CY ←1 • ;若(A)=data,则PC ←(PC)+3 • CJNE A, #data, rel; • CJNE Rn, #data, rel; • CJNE @Ri, #data, rel;

  14. 功能: ①比较前面两个操作数的大小, 如果它们的值不相等则转移。 ②转移地址的计算方法(pc)+3+rel。 ③如果第一个操作数(无符号整数)小于第二个操作数, 则进位标志CY置“1”, 否则清“0”, 但不影响任何操作数的内容。

  15. 四、 减 1不为0转移指令 • DJNZ Rn, rel; Rn ←(Rn)-1 • 若(Rn)≠0,则转移PC ← (PC)+2+rel • (Rn)=0, 则顺序执行PC←(PC)+2+rel  • DJNZ direct, rel;转移地址为=(pc)+3+rel

  16. 这两条指令把源操作数减 1, 结果回送到源操作数中去, 如果结果不为 0 则转移, PC←(PC)+指令字节数+rel。

  17. 例:试编写程序,将内部RAM以DATA为起始地址的10单位中的数据求和,并将结果送入SUM。设和不大于255。例:试编写程序,将内部RAM以DATA为起始地址的10单位中的数据求和,并将结果送入SUM。设和不大于255。 MOV R0,#DATA MOV R7, #0AH CLR A LOOP: ADD A,@R0 INC R0 DJNZ R7,LOOP MOV SUM, A SJMP $

  18. 例:将外部数据RAM的一个数据块送到内部RAM,两者的首地址分别为DATA1和DATA2,遇到传送的数据为“$”字符,则停止传送。例:将外部数据RAM的一个数据块送到内部RAM,两者的首地址分别为DATA1和DATA2,遇到传送的数据为“$”字符,则停止传送。

  19. MOV DPTR , #DATA1 MOV R1, #DATA2 LOOP:MOVX A, @DPTR CJNE A, #24H,LOOP1 SJMP LOOP2 LOOP1:MOV @R1,A INC DPTR INC R1 SJMP LOOP LOOP2:SJMP $

  20. 五、 调用及返回指令 在程序设计中, 通常把具有一定功能的公用程序段编制成子程序。 例: Y=a2+b2+c2 将X2作为子程序。

  21. 1. 长调用指令 LCALL addr16;PC ←(PC)+3 SP ← (SP)+1,(SP) ←(PC)7~10 SP ← (SP)+1,(SP) ←(PC)15~8 PC10~0 ←addr16 这条指令无条件调用位于 16 位地址addr16的子程序。

  22. 功能: ①先将PC+3以获得下一条指令的首地址, ②并把它压入堆栈(先低字节后高字节), SP内容加 2; ③将 16 位地址放入 PC中, 转去执行以该地址为入口的程序。 LCALL指令可以调用 64 KB范围内任何地方的子程序。    指令执行后不影响任何标志。

  23. 2. 绝对调用指令 ACALL addr11; PC ←(PC)+2 ;SP ← (SP)+1,(SP) ←(PC)7~10 ;SP ← (SP)+1,(SP) ←(PC)15~8 ;PC10~0 ←addr11 这是一条 2 KB范围内的子程序调用指令。

  24. 功能: ①先将 PC+2 以获得下一条指令的地址; ②将16 位地址压入堆栈(PCL内容先进栈, PCH内容后进栈), SP内容加 2; ③把PC的高 5 位PC15~PC11与指令中提供的 11 位地址addr11相连接(PC15~PC11, A10~A0), 形成子程序的入口地址送入PC, 使程序转向子程序执行。

  25. 所用的子程序的入口地址必须与 ACALL下面一条指令的第一个字节在同一个2 KB区域的存储器区。

  26. 主程序 调用 子程序 断点 返回 3. 子程序返回指令 RET ; PC15~8 ←( (SP)) , SP ← (SP)-1 PC7~0 ←( (SP)) , SP ← (SP)-1   放在程序的末尾; 这条指令的功能是: 恢复断点,将调用子程序时压入堆栈的下一条指令的首地址取出送入PC, 使程序返回主程序继续执行。

  27. 主程序 调用 中断服务程序 断点 返回 4. 中断返回指令 RETI; PC15~8 ←( (SP)) , SP ← (SP)-1 PC7~0 ←( (SP)) , SP ← (SP)-1 放在中断服务子程序的末尾; 从堆栈中自动取出断点送入PC,使程序自动返回到主程序的断开处。 

  28. 5.空操作指令: NOP ; PC←(PC)+1

More Related