文章目录
- 前言
- 一、无条件转移指令
- 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位;
- AJMP跳转范围是AJMP后面指令的第一个字节开始的同一2KB范围,也就是说先对PC+2(命令长度为2B),在跳转到以PC当前位置为基准的2KB范围内,如下例子;
- AJMP addr11表示跳转到以 PC15 PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0 为目标地址,最高5位为PC源最高5位的内容,剩下11位为addr11中对应的内容;
- 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 |
- rel是一个带符号的偏移字节数,其范围是-128~+127
- 00H~7FH(0000 0000B ~ 0111 1111B,第一个位为符号位)表示为0 ~ +127,正向转移;
- 80H ~ FFH(1000 0000B ~ 1111 1111B)表示为-128 ~ -1,反向转移;
- SJMP rel执行时是先将PC内容加2,在加相对地址;
例 (PC) = 0100H
- SJMP 55H:表示正向转移到0100H + 2 + 0055H = 0157H地址;
- SJMP F6H:表示反向转移到0100H + 2 + FFF6H = 00F8H地址。
- 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 |
- DPTR中存放16位基地址,累加器A存放目标转移地址对基地址的偏移量;
- 机器通过变址寻址转移指令便可实现程序的分支转移;
- DPTR中的值是固定的,通过修改A中的内容来选择跳转目标地址;
- 范围:以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 |
- JZ从英文字面上理解成A = Zero即0,就Jump,JNZ从英文字面上理解成A not Zero即!0,就Jump;
- 偏移量是一个带符号的8位,所有偏移量取值范围位-127~+128,同SJMP指令;
- 实际汇编中,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 |
- 三字节指令:CJMP (目的字节), (源字节), rel
- 执行CJMP指令结果可以简单理解,想等继续执行,CY清零;不相等,跳转,CY置一还是清零看比较大小;
- 目的字节 大于 源字节(前 大于 后)CY清零;
- 目的字节 小于 源字节(前 小于 后)CY置一;
- 程序转移范围以(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 |
- 执行一次该语句,第一操作数减一,判断字节变量是否为0,不为0则继续循环;为0,则退出循环;
- 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
调用和返回之间的过程:
- CPU在主程序中遇到调用子程序ADD1的指令;
- CPU下一条指令第一字节的地址(PC值,断点处)压入堆栈中;
- 栈指针(SP) + 2,并将ADD1的起始地址送入PC,开始执行子程序了。
- 子程序执行完,通过RET指令回调到主函数;
- 将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位值;
- 断点压入栈的过程
将栈指针SP向下移动一个单元空间(对其加一操作);
将PC的低8位送入SP的内容指向的单元空间;
再将栈指针SP向下移动一个单元空间;
将PC的高8位送入SP的内容指向的单元空间; - 跳转到子程序过程
将addr10 ~ 0送入PC10 ~ 0, PC15 ~ 11保持不变,形成16位转移目的地址;
PC就指向子程序的首地址; - 所调用的子程序首地址必须在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位值;
- 断点压入栈的过程
将栈指针SP向下移动一个单元空间(对其加一操作);
将PC的低8位送入SP的内容指向的单元空间;
再将栈指针SP向下移动一个单元空间;
将PC的高8位送入SP的内容指向的单元空间; - 跳转到子程序过程
将addr15 ~ 0送入PC15 ~ 0,形成16位转移目的地址;
PC就指向子程序的首地址; - 所调用的子程序首地址可以设置在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位值;
- 当子程序执行此指令表示子程序结束了
- 恢复断点过程
先将(SP)内容执行的地址空间作为PC的高8位;
SP指向上一个地址空间;
在将(SP)内容执行的地址空间作为PC的低8位;
SP指向上一个地址空间; - 此时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 |
- 累加器C是一个布尔累加器,位累加器;
- 根据累加器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 |
- 根据位变量bit的值进行判断转移;
- 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 |
- 相比于JB,JBC仅仅是增加CY清零的步骤;
- 在位变量bit为1时,不仅仅要跳转,还要CY清零。
五、空操作指令
NOP英文全称:No Operation
NOP
指令名称:空操作指令
助记符 | 功能 | 对标志位影响 | 字节数 | 周期数 | |||
P | OV | AC | CY | ||||
NOP | 空操作 | × | × | × | × | 1 | 1 |
51单片机之位操作指令SETB、CPL等
由本人水平有限,文章难免有错误,望告知