文章目录

  • 前言
  • 一、无条件转移指令
  • 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等

参考


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