文章目录

  • 前言
  • 一、无条件转移指令
    • LJMP addr16
    • AJMP addr11
    • SJMP rel
    • JMP @A + DPTR
    • 关于SJMP、AJMP、LJMP的选择
  • 二、条件转移指令
    • JZ rel
    • JNZ rel
    • CJNE XXX, XXX, rel
    • DJNZ XXX, rel
  • 三、调用和返回指令
    • ACALL addr11
    • LCALL addr16
    • RET
    • RETI
  • 四、位条件转移类指令
    • JC rel
    • JNC rel
    • JB bit, rel
    • JNB bit, rel
    • JBC bit, rel
  • 五、空操作指令
    • NOP

前言

控制指令是将程序跳转到某个指定的地址,在顺序执行
控制指令是通过修改PC的内容来实现跳转的功能
PC的内容是将要执行的下一跳指令的地址


一、无条件转移指令

LJMP英文全称:Long Jump
AJMP英文全称:Absolute Jump
SJMP英文全称:Short Jump
JMP英文全称:Jump


LJMP addr16

指令名称:长转移指令
目的:程序无条件转向64KB程序存储器地址空间的任何单元
源操作数:16位跳转目标地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
LJMP addr16 addr16 -> PC × × × × 3 2
  • 地址范围为0000H—FFFFH;
  • addr16常采用标号地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示;

AJMP addr11

指令名称:绝对转移指令
目的:程序无条件转向2KB程序存储器地址空间的任何单元
源操作数:11位跳转目标地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
AJMP addr16 (PC) + 2 -> PC, addr11 -> PC* × × × × 2 2

注:PC* 表示 PC10 ~ 0,共计11位;

  1. AJMP跳转范围是AJMP后面指令的第一个字节开始的同一2KB范围,也就是说先对PC+2(命令长度为2B),在跳转到以PC当前位置为基准的2KB范围内,如下例子;
  2. AJMP addr11表示跳转到以 PC15 PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0 为目标地址,最高5位为PC源最高5位的内容,剩下11位为addr11中对应的内容;
  3. AJMP因跳转的范围在LJMP(64KB)和SJMP(256B)之间,也可以叫中跳转指令。

例 若AJMP指令地址为2FFEH,跳转的范围为

  • PC + 2 = 3000H,故目标转移地址必在3000H—37FFH这2KB区域中;

例 若AJMP指令地址为2FFDH,跳转的范围为

  • PC + 2 = 2FFFH,故目标转移地址必在 2800H—2FFFH这2KB区域中;

SJMP rel

指令名称:相对短转移指令
目的:程序无条件转向256B程序存储器地址空间的任何单元
源操作数:8位跳转相对地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
SJMP rel (PC) + 2 -> PC, (PC) + rel -> PC × × × × 2 2
  1. rel是一个带符号的偏移字节数,其范围是-128~+127
  2. 00H~7FH(0000 0000B ~ 0111 1111B,第一个位为符号位)表示为0 ~ +127,正向转移;
  3. 80H ~ FFH(1000 0000B ~ 1111 1111B)表示为-128 ~ -1,反向转移;
  4. SJMP rel执行时是先将PC内容加2,在加相对地址;

例 (PC) = 0100H

  • SJMP 55H:表示正向转移到0100H + 2 + 0055H = 0157H地址;
  • SJMP F6H:表示反向转移到0100H + 2 + FFF6H = 00F8H地址。
  1. rel可以是转移的目的地址的标号;

例 SJMP RELADR,其中RELADR的标号为0123H,(PC) = 0100H;

  • 相对转移量 rel = 0123H - (0100 + 2)H = 21H;
  • rel并没有直接写出来,需要计算。

JMP @A + DPTR

指令名称:间接移指令/散转指令
目的:程序无条件转向DPTR和A之和的目标地址空间单元
源操作数:16位的DPTR和8位的累加器A

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
JMP @A + DPTR (A) + (DPTR) -> PC × × × × 1 2
  1. DPTR中存放16位基地址,累加器A存放目标转移地址对基地址的偏移量;
  2. 机器通过变址寻址转移指令便可实现程序的分支转移;
  3. DPTR中的值是固定的,通过修改A中的内容来选择跳转目标地址;
  4. 范围:以DPTR内容为首地址的256B范围内;

例 (DPTR) = 1000H,修改A中的内容

  • 设 A = 10H, (PC) = 1010H;
  • 设 A = 20H, (PC) = 1020H;
  • 设 A = 30H, (PC) = 1030H;

关于SJMP、AJMP、LJMP的选择

SJMP 如果跳转到的标号地址距离当前PC所指的地址小于256字节,用SJMP
AJMP 如果跳转到的标号地址距离当前PC所指的地址小于2K字节,用AJMP
LJMP 如果跳转到的标号地址距离当前PC所指的地址小于64K字节,用LJMP


二、条件转移指令

JZ英文全称:Jump if Zero
JNZ英文全称:Jump if Not Zero
CJNE英文全称:Compare Jump if Not Equal
DJNE英文全称:Compare Jump if Not Equal


JZ rel

指令名称:判零转移指令
目的:对累加器A中的内容进行零的判定
源操作数:8位跳转相对地址

JNZ rel

指令名称:判零转移指令
目的:对累加器A中的内容进行零的判定,同JZ
源操作数:8位跳转相对地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
JZ rel (PC) + 2 -> PC; 若 A = 0,则 (PC) + rel -> A;若 A != 0,则 顺序执行,不跳转 × × × × 2 2
JNZ rel (PC) + 2 -> PC; 若 A != 0,则 (PC) + rel -> A;若 A = 0,则 顺序执行,不跳转 × × × × 2 2
  1. JZ从英文字面上理解成A = Zero即0,就Jump,JNZ从英文字面上理解成A not Zero即!0,就Jump;
  2. 偏移量是一个带符号的8位,所有偏移量取值范围位-127~+128,同SJMP指令;
  3. 实际汇编中,rel用目标标号替代,如“JNZ NEXT”,此时rel并非一个在-127~+128之间的实际数,汇编时自动生成相对地址,同SJMP;

例 (PC) = 0100H

  • JNZ 55H:当 (A) = 01H, 非零时,表示正向转移到0100H + 2 + 0055H = 0157H地址;当 (A) = 00H,PC = 0102H,继续执行下一条指令,不跳转;

CJNE XXX, XXX, rel

指令名称:比较转移指令
目的:对指定的目的字节和源字节进行比较,不等转移,相等继续执行
源操作数:8位跳转相对地址,累加器A,直接地址direct,立即数#data,间接寄存器@Ri,寄存器Rn

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
CJNE A, direct, rel (PC) + 3 -> PC; 若(direct) < (A),则 (PC) + rel -> PC且 0 -> CY;若(direct) > (A),则 (PC) + rel -> PC且 1 -> CY;若 (direct) = (A),则顺序执行,不跳转且 0 -> CY; × × × 3 2
CJNE A, #data, rel (PC) + 3 -> PC; 若#data < (A),则 (PC) + rel -> PC且 0 -> CY;若#data > (A),则 (PC) + rel -> PC且 1 -> CY;若 #data = (A),则顺序执行,不跳转且 0 -> CY; × × × 3 2
CJNE Rn, #data, rel (PC) + 3 -> PC; 若#data < (Rn),则 (PC) + rel -> PC且 0 -> CY;若#data > (Rn),则 (PC) + rel -> PC且 1 -> CY;若 #data = (Rn),则顺序执行,不跳转且 0 -> CY; × × × 3 2
CJNE @Ri, #data, rel (PC) + 3 -> PC; 若#data < ((Ri)),则 (PC) + rel -> PC且 0 -> CY;若#data > ((Ri)),则 (PC) + rel -> PC且 1 -> CY;若 #data = ((Ri)),则顺序执行,不跳转且 0 -> CY; × × × 3 2
  1. 三字节指令:CJMP (目的字节), (源字节), rel
  2. 执行CJMP指令结果可以简单理解,想等继续执行,CY清零;不相等,跳转,CY置一还是清零看比较大小;
  3. 目的字节 大于 源字节(前 大于 后)CY清零;
  4. 目的字节 小于 源字节(前 小于 后)CY置一;
  5. 程序转移范围以(PC) + 3为起始地址的-128 ~ +127共256B;

(A) = 03H,(10) = 04H,CY = 0,rel = 30H,(PC) = 0100H

  • CJMP A, 10H
    (A) = 03H != (10H) = 04H,(PC) = (PC) + 3 + rel = 0133H;
    (A) < (10H) ,CY = 1;

DJNZ XXX, rel

指令名称:循环转移指令
目的:以直接地址或寄存器Rn的单元内容作为循环控制寄存器使用,利用其进行循环
源操作数:8位跳转相对地址,寄存器Rn,直接地址direct

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
DJNZ Rn, rel (PC) + 2 -> PC;(Rn) - 1 -> Rn;当(Rn) != 0时,则(PC) + rel -> PC;当(Rn) = 0时,则结束循环,程序往下执行 × × × × 2 2
DJNZ direct, rel (PC) + 3 -> PC;(direct) - 1 -> direct;当(direct) != 0时,则(PC) + rel -> PC;当(direct) = 0时,则结束循环,程序往下执行 × × × × 3 2
  1. 执行一次该语句,第一操作数减一,判断字节变量是否为0,不为0则继续循环;为0,则退出循环;
  2. DJNZ可以理解高级语言中的for (int i = n; i > 0; i–)循环语句;

例 设(R1)= 07H,rel = 10H,(PC) = 0100H

  • DJNZ R1, rel
    R1循环07H,需要进行7次循环才为00H;
    循环7次后,(PC) = 0114H;
    跳转后, (PC) = 0124H

三、调用和返回指令

ACALL英文全称:Absolute subroutine Call
LCALL英文全称:Long subroutine Call
RET英文全称:Return from Subroutine
RETI英文全称:Return from Interruption

调用和返回之间的过程:

  1. CPU在主程序中遇到调用子程序ADD1的指令;
  2. CPU下一条指令第一字节的地址(PC值,断点处)压入堆栈中;
  3. 栈指针(SP) + 2,并将ADD1的起始地址送入PC,开始执行子程序了。
  4. 子程序执行完,通过RET指令回调到主函数;
  5. 将SP中的地址弹回PC中,回到主函数中。

ACALL addr11

指令名称:短调用指令
目的:调用2KB范围内的所指定的子程序
源操作数:11位目的地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
ACALL addr11 (PC) + 2 -> PC;(SP) + 1 -> (SP), (PCL) -> (SP),(SP) + 1 -> (SP), (PCH) -> (SP),addr(10~0) -> PC(10~0); × × × × 2 2

注:

  • PCL为PC7 ~ 0即PC的低8位值;
  • PCH为PC15 ~ 8即PC的高8位值;
  1. 断点压入栈的过程
    将栈指针SP向下移动一个单元空间(对其加一操作);
    将PC的低8位送入SP的内容指向的单元空间;
    再将栈指针SP向下移动一个单元空间;
    将PC的高8位送入SP的内容指向的单元空间;
  2. 跳转到子程序过程
    将addr10 ~ 0送入PC10 ~ 0, PC15 ~ 11保持不变,形成16位转移目的地址;
    PC就指向子程序的首地址;
  3. 所调用的子程序首地址必须在ACALL指令后第一字节开始的2KB范围内的ROM中。

例 (SP) = 40H,(PC) = 0100H,子程序ADD1首地址 0110H;

  • 执行ACALL ADD1
  • (PC) = (PC) + 2 = 0102H;先将PC加2,因指令长2字节;
  • (41H) = 02H ;先将PC的低8位放入SP指针内容的空间地址;
  • (42H) = 01H ;先将PC的高8位放入SP指针内容的空间地址,此时(SP) = 42H;
  • (PC) = 0110H;PC指向了子程序ADD1首地址;

LCALL addr16

指令名称:长调用指令
目的:调用64KB范围内的所指定的子程序
源操作数:16位目的地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
ACALL addr11 (PC) + 3 -> PC;(SP) + 1 -> (SP), (PCL) -> (SP),(SP) + 1 -> (SP), (PCH) -> (SP),addr(15~0) -> PC; × × × × 3 2

注:

  • PCL为PC7 ~ 0即PC的低8位值;
  • PCH为PC15 ~ 8即PC的高8位值;
  1. 断点压入栈的过程
    将栈指针SP向下移动一个单元空间(对其加一操作);
    将PC的低8位送入SP的内容指向的单元空间;
    再将栈指针SP向下移动一个单元空间;
    将PC的高8位送入SP的内容指向的单元空间;
  2. 跳转到子程序过程
    将addr15 ~ 0送入PC15 ~ 0,形成16位转移目的地址;
    PC就指向子程序的首地址;
  3. 所调用的子程序首地址可以设置在64KB范围内的ROM中。

例 (SP) = 07H,(PC) = 0123H,子程序ADD1首地址 5678H;

  • 执行LCALL ADD1
  • (PC) = (PC) + 3 = 0126H;先将PC加3,因指令长3字节;
  • (08H) = 26H ;先将PC的低8位放入SP指针内容的空间地址;
  • (09H) = 01H ;先将PC的高8位放入SP指针内容的空间地址,此时(SP) = 09H;
  • (PC) = 5678H;PC指向了子程序ADD1首地址。

ACALL是你调用的子程序入口地址距离当前PC所指地址需介于0~2K,LCALL是0~64K


RET

指令名称:子程序返回指令
目的:从子程序返回

RETI

指令名称:中断返回指令
目的:从中断返回

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
RET ((SP)) -> PCH,(SP) - 1 -> SP,((SP)) -> PCL,(SP) - 1 -> SP × × × × 1 2
RETI ((SP)) -> PCH,(SP) - 1 -> SP,((SP)) -> PCL,(SP) - 1 -> SP × × × × 1 2

注:

  • PCL为PC7 ~ 0即PC的低8位值;
  • PCH为PC15 ~ 8即PC的高8位值;
  1. 当子程序执行此指令表示子程序结束了
  2. 恢复断点过程
    先将(SP)内容执行的地址空间作为PC的高8位;
    SP指向上一个地址空间;
    在将(SP)内容执行的地址空间作为PC的低8位;
    SP指向上一个地址空间;
  3. 此时PC中有返回目的地址的16位;

例 (SP) = 09H,(09H) = 01H,(08H) = 26H,(PC) = 5678H

  • 在子程序中执行RET
  • (PC) = 0178H;先将(SP)内容执行的地址空间内容作为PC的高8位;
  • (SP) = 08H;将(SP)内容减1;
  • (PC) = 0126H;先将(SP)内容执行的地址空间内容作为PC的低8位;
  • (SP) = 07H;将(SP)内容减1;
  • 此时已经返回到地址为0126H的地址。

四、位条件转移类指令

JC英文全称:Jump if the Carry flag is set
JNC英文全称:Jump if Not Carry
JB英文全称:Jump if the Bit is set
JNB英文全称:Jump if the Bit is Not set
JBC英文全称:Jump if the Bit is set and Clear the bit


JC rel

指令名称:判布尔累加器C转移指令
操作数:8位目的地址

JNC rel

指令名称:判布尔累加器C转移指令
操作数:8位目的地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
JC rel (PC) + 2 -> PC,若(C) = 1,则(PC) + rel -> PC;若(C) = 0,则顺序执行 × × × × 2 2
JNC rel (PC) + 2 -> PC,若(C) = 0,则(PC) + rel -> PC;若(C) = 1,则顺序执行 × × × × 2 2
  1. 累加器C是一个布尔累加器,位累加器;
  2. 根据累加器C中的值进行判断转移。

JB bit, rel

指令名称:判位变量转移指令
操作数:位变量,8位目的地址

JNB bit, rel

指令名称:判位变量转移指令
操作数:位变量,8位目的地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
JB bit rel (PC) + 3 -> PC,若(bit) = 1,则(PC) + rel -> PC;若(bit) = 0,则顺序执行 × × × × 3 2
JNB bit rel (PC) + 3 -> PC,若(bit) = 0,则(PC) + rel -> PC;若(bit) = 1,则顺序执行 × × × × 3 2
  1. 根据位变量bit的值进行判断转移;
  2. JB、JNB相对于JC、JNC,其是对位变量bit进行判断转移,其他性质都一样。

JBC bit, rel

指令名称:判位变量并清零转移指令
操作数:位变量,8位目的地址

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
JBC bit rel (PC) + 3 -> PC,若(bit) = 1,则(PC) + rel -> PC,0 -> CY;若(bit) = 0,则顺序执行 × × × × 3 2
  1. 相比于JB,JBC仅仅是增加CY清零的步骤;
  2. 在位变量bit为1时,不仅仅要跳转,还要CY清零。

五、空操作指令

NOP英文全称:No Operation

NOP

指令名称:空操作指令

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
NOP 空操作 × × × × 1 1

51单片机之系统指令

51单片机之逻辑运算指令ANL、ORL、XRL等

51单片机之数据转移指令MOV、MOVX、MOVC等

51单片机之位操作指令SETB、CPL等

51单片机之算术运算指令ADDC、SUBB等

参考


由本人水平有限,文章难免有错误,望告知

51单片机之控制转移指令SJMP、LJMP等相关推荐

  1. 单片机 c语言百位加上小数点,51单片机水温控制LCD显示加VB上位机温度曲线绘制...

    现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变. 矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线 /***** ...

  2. ESP8266 AT指令设置及51单片机的控制

    ESP8266 AT指令设置及51单片机的控制 (献给正在学习路上的兄弟姐妹们) 对于ESP8266模块好多刚接触的朋友们第一感觉就是价格的确很便宜,然而初次接触它时你也许会对它束手无策,因为关于怎样 ...

  3. 51单片机+L298N控制步进电机【T型】加减速

    本文介绍另一种常见的步进电机[T型]加减速方法 关于L298N模块的使用介绍.以及S型加减速可以上一篇文章,传送门如下: 51单片机+L298N控制步进电机S曲线加减速 1. 与S曲线加减速对比 1. ...

  4. 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void dela ...

  5. 机械手编程用c语言,51单片机机械手控制C程序.doc

    51单片机机械手控制C程序 //包含所需头文件 #include #define uchar unsigned char /***************------宏定义------******** ...

  6. 51单片机STC15W4K56S4控制步进电机28BYJ-48正反转

    步进电机28BYJ-48(12V)介绍: 首先,我们看下步进电机28BYJ-48(12V)外观图,如下: 28BYJ-48(12V)含义如下:28表示电机直径28毫米,B表示电机 ,Y表示永磁,J表示 ...

  7. 基于51单片机51wifi控制4路继电器开关定时功能

    项目简介: 一款基于STC89C52单片机的手机WIFI控制4路继电器的插座控制器设计.通过安装手机APP实现手机和设备的互联,只要手机发送相应的指令,继电器将会按照相关指令进行操作该设计极大的方便了 ...

  8. 51单片机+步进电机控制正反转8拍控制+Proteus仿真

    51单片机+步进电机控制正反转8拍控制+Proteus仿真 更新内容(2022年5月2日) 调整了Proteus仿真接线问题, 程序代码 急停放在了外部中断0里面实现. #include<reg ...

  9. 【Proteus仿真】51单片机+按键控制步进电机驱动+LCD1602显示

    [Proteus仿真]51单片机+按键控制步进电机驱动+LCD1602显示 Proteus仿真 在Proteus当中,步进电机选取的不同,接线的顺序不同,为了避免在接线出错,将里面的两种步进电机都选择 ...

  10. 51单片机PCA9685控制16路舵机(代码可直接使用)

    51单片机PCA9685控制16路舵机 /**************************************************************************PCA96 ...

最新文章

  1. 5G+AI成产业新引擎 安防行业切入点在哪里?
  2. 【转】NHIBERNATE的各种保存方式的区别 (SAVE,PERSIST,UPDATE,SAVEORUPDTE,MERGE,FLUSH,LOCK)
  3. linux安装web服务器httpd,Linux_linux构建动态WEB服务器安装篇,基本配置 安装web服务器:httpd-2. - phpStudy...
  4. 零基础学Python:自定义序列类的详细教程
  5. ORACLE11G自动维护任务简析
  6. Androidの多线程之更新ui(Thread+Handler+Message)
  7. LeetCode之Merge Two Sorted Lists
  8. 为什么要学习Java EE?需要掌握哪些技能?
  9. 深信服 linux软件开发面试题整理
  10. Win10 Delete键失效怎么办 ?
  11. OutMan——Foundation框架中的集合类(三)
  12. 高数 | 导数极限定理、分段点求导能不能用公式?导数和导数的极限?
  13. Hexo+Github轻松搭建个人博客
  14. 这五个姓氏你根本没见过,第三个甚至难以启齿
  15. 前端实现旗帜飘动效果系列 (Ⅰ):dom+css实现
  16. Vue笔记随笔---kalrry
  17. c++,数组与指针的差别
  18. 163邮箱注册,163邮箱申请方法
  19. 泰勒展开:一阶,二阶
  20. Java Script网页特效实例大全

热门文章

  1. Java Eclipse部分图标汇总
  2. MacBooster CleanMyMac CCleaner三款Mac清理工具该如何选择
  3. 京东云的区块链“经”
  4. linux系统刷苹果4s,iOS8.4降级6.1.3教程 iPhone4s降级iOS6.1.3
  5. 华为云计算IE面试笔记-云磁盘和普通磁盘的区别。
  6. linux在当前目录 查找abc文件夹,《find技巧》-“linux命令五分系列”之一
  7. IDEA设置注释模板
  8. ms17010批量扫描备忘
  9. html播放m3u8格式转换,m3u8格式如何播放
  10. 【OpenCV】 码书(CodeBook)基本原理介绍