C51控制转移类指令及位操作指令
- 格式:ppt
- 大小:487.50 KB
- 文档页数:46
)→))C51汇编伪指令:1、DS ---预留存储区命令格式:〔标号:〕DS 表达式值其功能是从指定地址开始,定义一个存储区,以备源程序使用。
存储区预留的存储单元数由表达式的值决定。
TMP: DS 1从标号TEP地址处开始保留1个存储单元(字节)。
2、BIT---定义位命令格式:字符名称BIT 位地址其功能用于给字符名称定义位地址。
SPK BIT P3.7经定义后,允许在指令中用SPK代替P3.7。
3、USING指令USING指令通知汇编器使用8051的哪一个工作寄存器组。
格式:USING 表达式(值必须为0-3,默认值为0。
)USING 0使用第0组工作寄存器。
4、SEGMENT指令SEGMENT 指令用来声明一个再定位段和一个可选的再定位类型。
格式:再定位段名SEGMENT 段类型〔再定位类型〕其中,“再定位段名”用于指明所声明的段。
“段类型”用于指定所声明的段将处的存储器地址空间。
可用的段类型有CODE、XDA TA、DA TA、IDA TA和BIT。
STACK_SEG SEGMENT IDA TADA TA_SEG SEGMENT DATA5、RSEG---再定位段选择指令再定位段选择指令为RSEG,用于选择一个已在前面定义过的再定位段作为当前段。
格式:RSEG 段名段名必须是在前面已经声明过的再定位段。
DA TA_SEG SEGMENT DATA ;声明一个再定位DATA段RSEG DATA_SEG ;选择前面声明的再定位DA TA段作为当前段6、绝对段选择指令CSEG---绝对代码段DSEG---内部绝对数据段XSEG---外部绝对数据段ISEG---内部间接寻址数据段BSEG---绝对位寻址数据段格式:CSEG [AT 绝对地址表达式]DSEG [AT 绝对地址表达式]XSEG [AT 绝对地址表达式]ISEG [AT 绝对地址表达式]BSEG [AT 绝对地址表达式]括号内是可选项,用来指定当前绝对段的基地址。
51指令集指令格式 功能简述 字节数 周期一、数据传送类指令MOV A, Rn 寄存器送累加器 1 1MOV Rn,A 累加器送寄存器 1 1MOV A ,@Ri 内部RAM单元送累加器 1 1MOV @Ri ,A 累加器送内部RAM单元 1 1MOV A ,#data 立即数送累加器 2 1MOV A ,direct 直接寻址单元送累加器 2 1MOV direct ,A 累加器送直接寻址单元 2 1MOV Rn,#data 立即数送寄存器 2 1MOV direct ,#data 立即数送直接寻址单元 3 2MOV @Ri ,#data 立即数送内部RAM单元 2 1MOV direct ,Rn 寄存器送直接寻址单元 2 2MOV Rn ,direct 直接寻址单元送寄存器 2 2MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2XCH A ,Rn 累加器与寄存器交换 1 1XCH A ,@Ri 累加器与内部RAM单元交换 1 1XCHD A ,direct 累加器与直接寻址单元交换 2 1XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1POP direct 栈顶弹出指令直接寻址单元 2 2PUSH direct 直接寻址单元压入栈顶 2 2二、算术运算类指令ADD A, Rn 累加器加寄存器 1 1ADD A, @Ri 累加器加内部RAM单元 1 1ADD A, direct 累加器加直接寻址单元 2 1ADD A, #data 累加器加立即数 2 1ADDC A, Rn 累加器加寄存器和进位标志 1 1ADDC A, @Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1ADDC A, direct 累加器加直接寻址单元和进位标志 2 1 INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接寻址单元加1 2 1INC @Ri 内部RAM单元加1 1 1INC DPTR 数据指针加1 1 2DA A 十进制调整 1 1SUBB A, Rn 累加器减寄存器和进位标志 1 1SUBB A, @Ri 累加器减内部RAM单元和进位标志 1 1 SUBB A, #data 累加器减立即数和进位标志 2 1SUBB A, direct 累加器减直接寻址单元和进位标志 2 1 DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC @Ri 内部RAM单元减1 1 1DEC direct 直接寻址单元减1 2 1MUL AB 累加器乘寄存器B 1 4DIV AB 累加器除以寄存器B 1 4三、逻辑运算类指令ANL A, Rn 累加器与寄存器 1 1ANL A, @Ri 累加器与内部RAM单元 1 1ANL A, #data 累加器与立即数 2 1ANL A, direct 累加器与直接寻址单元 2 1ANL direct, A 直接寻址单元与累加器 2 1ANL direct, #data 直接寻址单元与立即数 3 1ORL A, Rn 累加器或寄存器 1 1ORL A,@Ri 累加器或内部RAM单元 1 1ORL A,#data 累加器或立即数 2 1ORL A,direct 累加器或直接寻址单元 2 1ORL direct, A 直接寻址单元或累加器 2 1ORL direct, #data 直接寻址单元或立即数 3 1XRL A, Rn 累加器异或寄存器 1 1XRL A,@Ri 累加器异或内部RAM单元 1 1XRL A,#data 累加器异或立即数 2 1XRL A,direct 累加器异或直接寻址单元 2 1XRL direct, A 直接寻址单元异或累加器 2 1XRL direct, #data 直接寻址单元异或立即数 3 2RL A 累加器左循环移位 1 1RLC A 累加器连进位标志左循环移位 1 1RR A 累加器右循环移位 1 1RRC A 累加器连进位标志右循环移位 1 1CPL A 累加器取反 1 1CLR A 累加器清零 1 1四、控制转移类指令类ACCALL addr11 2KB范围内绝对调用 2 2AJMP addr11 2KB范围内绝对转移 2 2LCALL addr16 2KB范围内长调用 3 2LJMP addr16 2KB范围内长转移 3 2SJMP rel 相对短转移 2 2JMP @A+DPTR 相对长转移 1 2RET 子程序返回 1 2RET1 中断返回 1 2JZ rel 累加器为零转移 2 2JNZ rel 累加器非零转移 2 2CJNE A ,#data ,rel 累加器与立即数不等转移 3 2CJNE A ,direct ,rel 累加器与直接寻址单元不等转移 3 2 CJNE Rn,#data ,rel 寄存器与立即数不等转移 3 2CJNE @Ri ,#data,rel RAM单元与立即数不等转移 3 2 DJNZ Rn ,rel 寄存器减1不为零转移 2 2DJNZ direct ,rel 直接寻址单元减1不为零转移 3 2NOP 空操作 1 1五、布尔操作类指令MOV C, bit 直接寻址位送C 2 1MOV bit, C C送直接寻址位 2 1CLR C C清零 1 1CLR bit 直接寻址位清零 2 1CPL C C取反 1 1CPL bit 直接寻址位取反 2 1SETB C C置位 1 1SETB bit 直接寻址位置位 2 1ANL C, bit C逻辑与直接寻址位 2 2ANL C, /bit C逻辑与直接寻址位的反 2 2 ORL C, bit C逻辑或直接寻址位 2 2ORL C, /bit C逻辑或直接寻址位的反 2 2 JC rel C为1转移 2 2JNC rel C为零转移 2 2JB bit,rel 直接寻址位为1转移 3 2JNB bit,rel 直接寻址为0转移。
C51调汇编移位函数详解引言在C51单片机编程中,移位操作是一种常见的操作。
移位操作可以将一个数的二进制表示在内部进行左移或右移,从而改变数的值。
C51提供了一些用于实现移位功能的汇编指令,如RL、RR、SL、SR等。
为了方便使用这些指令,可以编写一些特定函数来实现不同类型的移位操作。
本文将详细解释C51调汇编移位函数中的特定函数,包括函数的定义、用途和工作方式等。
函数定义在C语言中,可以使用__asm关键字来嵌入汇编代码。
通过嵌入汇编代码,可以直接调用C51提供的汇编指令。
下面是一个示例函数left_shift()的定义:void left_shift(unsigned char *data, unsigned char count) {__asmmov r0, dpl ; 将data指针中的值赋给r0寄存器mov r1, dph ; 将data指针中的高字节值赋给r1寄存器mov a, count ; 将count赋给累加器astart:rl a ; 左移累加器amovx @r0, a ; 将累加器a的值写入data指针所指向的内存inc r0 ; data指针自增1djnz r1, start ; 如果r1不为0,则跳转到start标签处继续执行__endasm;}函数用途left_shift()函数的作用是将一个字节的数据进行左移操作。
左移操作是指将一个数的二进制表示向左移动指定的位数,低位补零。
这种操作可以用来实现乘以2的幂次方运算。
例如,对于数据0b00001010,左移一位后得到0b00010100,等价于乘以2。
函数工作方式left_shift()函数使用了C51提供的汇编指令rl和movx来实现左移操作。
下面是函数工作方式的详细解释:1.将传入的指针data中存储的值分别赋给寄存器r0和r1。
寄存器r0用于访问data指针所指向的内存地址,寄存器r1用于保存data指针所指向内存地址的高字节。
在汇编中用RR RRC RL RLC就很容易实现移位,在c51中利用<<,>>就很容易的实现移出。
移入就显得比较麻烦,特别是右移入。
(1:)送数送两个单独字节的数据的程序,左送 &0x80(左移给数) ,从最高位-最低位顺序给数右送 &0x01 (右移给数),最低位-最高位给数bit out;out = low & 0x01;low >>= 1;low |= (high & 0x01)<<7;high >>= 1;( 2):取数(不管怎么移入,第一次操作之后获取的那一位数据必须在接受数据的最高位或者最低位上,从而选择是先取数还是先移位)a:如果是先接受高位后接受低位则先左移一位后接受一位数据(i2c总线)uchar i;uchar temp = 0;uchar date = 0x82;for (i = 0; i < 8; i++){temp <<= 1; //左移temp |= (bit)(date & 0x80);date <<= 1;}b:如果是先接受低位,后接受高位则先接受一位数据后循环右移一位(DS18B20)uchar i;uchar temp = 0;uchar date = 0x82;for (i = 0; i < 8; i ++){temp |= (bit)(date & 0x01);date >>= 1;temp = _cror_(temp,1);//循环右移,应用_cror_()需要包含头文件<intrins.h>}如果不用函数则for循环应该这样写for (i = 0; i < 8; i ++){temp >>= 1;temp |= (date & 0x01) << 7; date >>= 1;}(3.)任意一位的置位或者取反运算置位运算low |= 0x01; (置最低位为1)取反运算low |= ~low & 0x01;(4.)合并和拆分数据1:合并两个单字节数据为一个双字节数据 int len;uchar low;uchar high;Len |= high;Len <<= 8;Len |= low;2: 拆分一个双字节数据为两个单字节数据 int len;uchar low;uchar high;low |= len;high |= len >> 8;。
51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。
要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。
下面就为大家汇总一下 51 单片机的常见指令。
数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。
例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。
MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。
比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。
MOVC 指令:用于访问程序存储器中的数据表格。
“MOVC A, @A+DPTR”是常见的用法。
算术运算类指令ADD 指令:实现加法运算。
像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。
ADDC 指令:带进位加法指令。
考虑了上一次运算产生的进位标志。
SUBB 指令:用于减法运算,并且会考虑借位标志。
逻辑运算类指令ANL 指令:进行逻辑与操作。
例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。
ORL 指令:执行逻辑或操作。
XRL 指令:实现逻辑异或运算。
控制转移类指令JC 指令:若进位标志为 1 则跳转。
JZ 指令:若累加器 A 的内容为 0 则跳转。
LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。
位操作类指令SETB 指令:将指定的位设置为 1。
例如“SETB P10”,将 P1 端口的第 0 位置 1。
CLR 指令:把指定的位清零。
这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。
在编程时,合理选择和运用这些指令能够实现各种复杂的功能。
比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。
51单片机条件转移指令51单片机是一种常用的单片机芯片,它的条件转移指令在编程中起着重要的作用。
条件转移指令是根据特定的条件来决定程序的执行路径,使得程序具备一定的智能性和灵活性。
下面我们来详细介绍51单片机的条件转移指令以及它们的使用方法和注意事项。
51单片机的条件转移指令主要有以下几种:条件跳转指令、循环控制指令和中断指令。
这些指令可以根据特定的条件来改变程序执行的顺序和逻辑,实现程序的分支和循环控制。
首先,我们来介绍条件跳转指令。
条件跳转指令一般用于根据某个条件来跳转到不同的程序地址。
其中比较常见的有“跳转指令”、“条件判断指令”和“条件转移指令”等。
跳转指令可以根据某个条件来跳转到指定的程序地址,比如“跳转到某个子程序”或“跳转到某个循环体”。
条件判断指令可以根据特定的条件来执行跳转或继续执行下一条指令,比如“如果某个条件成立,就跳转到某个程序地址;否则继续执行下一条指令”。
条件转移指令一般用于根据某个条件转移到不同的程序地址,比如“如果某个条件成立,就转移到某个程序地址;否则继续执行下一条指令”。
其次,我们介绍循环控制指令。
循环控制指令一般用于实现程序的循环执行,其中比较常见的有“循环指令”和“计数器指令”等。
循环指令可以通过设置循环条件来实现程序的循环执行,比如“当某个条件成立时,就一直循环执行某段程序”。
计数器指令一般通过设置一个计数器来实现程序的循环执行,比如“循环执行某段程序一定的次数”。
最后,我们介绍中断指令。
中断指令主要用于处理外部的中断事件,比如“按键中断”和“定时器中断”等。
中断指令可以在程序执行的过程中,根据外部中断事件的发生来中断当前的执行流程,执行中断服务程序,处理完中断事件后,再返回到原来的程序地址继续执行。
在使用51单片机的条件转移指令时,需要注意以下几点。
首先,要根据具体的需求选择合适的条件转移指令,合理组织程序的逻辑结构。
其次,要注意条件转移指令的执行过程中是否会对程序的性能和时序等方面造成影响。
格式功能简述字节数周期一、数据传送类指令M O V A,R n寄存器送累加器1 1 M O V R n,A累加器送寄存器1 1 M O V A,@R i内部R A M单元送累加器1 1 M O V@R i,A累加器送内部R A M单元1 1 M O V A,#d a t a立即数送累加器2 1 M O V A,d i r e c t直接寻址单元送累加器2 1 M O V d i r e c t,A累加器送直接寻址单元2 1 M O V R n,#d a t a立即数送寄存器2 1 M O V d i r e c t,#d a t a立即数送直接寻址单元32 M O V@R i,#d a t a立即数送内部R A M单元21 M O V d i r e c t,R n寄存器送直接寻址单元2 2 M O V R n,d i r e c t直接寻址单元送寄存器2 2 M O V d i r e c t,@R i内部R A M单元送直接寻址单元22 M O V@R i,d i r e c t直接寻址单元送内部R A M单元22 M O V d i r e c t2,d i r e c t1直接寻址单元送直接寻址单元32M O V D P T R,#d a t a1616位立即数送数据指针32 M O V X A,@R i外部R A M单元送累加器(8位地址)12 M O V X@R i,A累加器送外部R A M单元(8位地址)12 M O V X A,@D P T R外部R A M单元送累加器(16位地址)12 M O V X@D P T R,A累加器送外部R A M单元(16位地址)12 M O V C A,@A+D P T R查表数据送累加器(D P T R为基址)12 M O V C A,@A+P C查表数据送累加器(P C为基址)12 X C H A,R n累加器与寄存器交换1 1 X C H A,@R i累加器与内部R A M单元交换1 1 X C H D A,d i r e c t累加器与直接寻址单元交换21 X C H D A,@R i累加器与内部R A M单元低4位交换11 S W A P A累加器高4位与低4位交换1 1 P O P d i r e c t栈顶弹出指令直接寻址单元2 2 P U S H d i r e c t直接寻址单元压入栈顶2 2二、算术运算类指令A D D A,R n累加器加寄存器1 1 A D D A,@R i累加器加内部R A M单元1 1A D D A,d i r e c t累加器加直接寻址单元2 1A D D A,#d a t a累加器加立即数2 1 A D D C A,R n累加器加寄存器和进位标志1 1 A D D C A,@R i累加器加内部R A M单元和进位标志11 A D D C A,#d a t a累加器加立即数和进位标志21 A D D C A,d i r e c t累加器加直接寻址单元和进位标志21I N C A累加器加11 1I N C R n寄存器加11 1I N C d i r e c t直接寻址单元加12 1I N C@R i内部R A M单元加11 1I N C D P T R数据指针加11 2D A A十进制调整1 1 S U B B A,R n累加器减寄存器和进位标志1 1 S U B B A,@R i累加器减内部R A M单元和进位标志11 S U B B A,#d a t a累加器减立即数和进位标志21 S U B B A,d i r e c t累加器减直接寻址单元和进位标志21D E C A累加器减11 1D E C R n寄存器减11 1D E C@R i内部R A M单元减11 1 D E C d i r e c t直接寻址单元减12 1M U L A B累加器乘寄存器B1 4D I V A B累加器除以寄存器B1 4三、逻辑运算类指令A N L A,R n累加器与寄存器1 1 A N L A,@R i累加器与内部R A M单元1 1 A N L A,#d a t a累加器与立即数2 1 A N L A,d i r e c t累加器与直接寻址单元2 1 A N L d i r e c t,A直接寻址单元与累加器2 1 A N L d i r e c t,#d a t a直接寻址单元与立即数31O R L A,R n累加器或寄存器1 1 O R L A,@R i累加器或内部R A M单元1 1 O R L A,#d a t a累加器或立即数2 1 O R L A,d i r e c t累加器或直接寻址单元2 1 O R L d i r e c t,A直接寻址单元或累加器2 1O R L d i r e c t,#d a t a直接寻址单元或立即数31 X R L A,R n累加器异或寄存器1 1 X R L A,@R i累加器异或内部R A M单元1 1 X R L A,#d a t a累加器异或立即数2 1 X R L A,d i r e c t累加器异或直接寻址单元2 1 X R L d i r e c t,A直接寻址单元异或累加器2 1 X R L d i r e c t,#d a t a直接寻址单元异或立即数32 R L A累加器左循环移位1 1 R L C A累加器连进位标志左循环移位1 1 R R A累加器右循环移位1 1 R R C A累加器连进位标志右循环移位1 1C P L A累加器取反1 1C L R A累加器清零1 1四、控制转移类指令类A C C A L L a d d r112K B范围内绝对调用2 2 A J M P a d d r112K B范围内绝对转移2 2 L C A L L a d d r162K B范围内长调用3 2L J M P a d d r162K B范围内长转移3 2 S J M P r e l相对短转移2 2 J M P@A+D P T R相对长转移1 2 R E T子程序返回1 2R E T1中断返回1 2 J Z r e l累加器为零转移2 2 J N Z r e l累加器非零转移2 2 C J N E A,#d a t a,r e l累加器与立即数不等转移32 C J N E A,d i r e c t,r e l累加器与直接寻址单元不等转移32 C J N E R n,#d a t a,r e l寄存器与立即数不等转移32C J N E@R i,#d a t a,r e l R A M单元与立即数不等转移32D J N Z R n,r e l寄存器减1不为零转移2 2 D J N Z d i r e c t,r e l直接寻址单元减1不为零转移32N O P空操作1 1五、布尔操作类指令M O V C,b i t直接寻址位送C2 1 M O V b i t,C C送直接寻址位2 1C L R C C清零1 1C L R b i t直接寻址位清零2 1C P L C C取反1 1C P L b i t直接寻址位取反2 1S E T B C C置位1 1 S E T B b i t直接寻址位置位2 1A N L C,b i t C逻辑与直接寻址位2 2A N L C,/b i t C逻辑与直接寻址位的反2 2O R L C,b i t C逻辑或直接寻址位2 2O R L C,/b i t C逻辑或直接寻址位的反2 2 J C r e l C为1转移2 2J N C r e l C为零转移2 2 J B b i t,r e l直接寻址位为1转移3 2J N B b i t,r e l直接寻址为0转移1、D1~D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全亮;2、按规定顺序依次熄灭(间隔1秒),最后全灭;3、八个灯同时点亮,保持1秒;4、八个灯同时熄灭,保持秒;再将第3、4步重复4遍,最后整个程序再重复N遍。
控制转移类指令和位操作指令(一).控制转移类指令计算机运行过程中,有时因为操作的需要,程序不能按顺序逐条执行指令,需要改变程序运行方向,即将程序跳转到某个指定的地址再顺序执行下去。
控制转移类指令的功能就是根据要求修改程序计数器PC的内容,以改变程序运行方向,实现转移。
控制转移类指令可分为:无条件转移、条件转移、绝对转移、相对转移和调用、返回指令。
下面我们将分类介绍。
1.无条件转移指令(4条)LJMP add16 ;add16→PC,无条件跳转到add16地址,可在64KB范围内转移,称为长转移指令AJMP add11 ;add11→PC,无条件转向add11地址,在2KB范围内转移SJMP rel ;PC+2+rel→PC,相对转移,rel是偏移量,8 位有符号数,范围-128~127,即可向后跳转128,向前可跳转127JMP @A+DPTR ;A+DPTR→PC ,属散转指令,无条件转向A与DPTR内容相加后形成的新地址例执行指令LJMP 9100H不管这条指令存放在哪里,执行时将使程序转移到9100H,和AJMP,SJMP指令是有差别的。
例程序2000H MOV R0 , #10H ;10H→PC2002H SJMP 03H ;PC+2+rel=2002H+2+03H=2007H→PC┇┇2006H ┇2007H ┇从说明中可见,执行SJMP 03H 指令后,马上跳转到2007H地址执行程序。
2.条件转移指令(8条)条件转移指令是根据某种特定条件转移的指令。
条件满足时转移,条件不满足时则顺序执行下面的指令。
JZ rel ;A=0转向PC+2+rel→PC,A≠0顺序执行JNZ rel ;A≠转向PC+2+rel→PC ,A=0顺序执行CJNE A, direct, rel ;A≠ (direct)转向PC+3+rel→PC且当A>(direct),Cy=0;当A<(direct),Cy=1;否则A=(direct),PC+3→PC即顺序执行CJNE A, #data, rel ;A data P转向PC+3+rel→PC且当A >data,Cy=0;当A <data,Cy=1,;A=data,PC+3→PC顺序执行CJNZ Rn, #data, rel ;Rn≠data转向PC+3+rel→PC;且当Rn>data,Cy=0,当Rn<data,Cy=1;Rn=data,PC+3→PC顺序执行CJNE @Ri,#data, rel ;(Ri) ≠data ,PC+3+rel→PC;且当(Ri)>data ,Cy=0,当(Ri)<data,Cy=1;(Ri)=data, PC+3→PC顺序执行DJNZ Rn, rel ;Rn-1→Rn ,Rn ≠0转向PC+2+rel→PC;Rn=0,PC+2→PC顺序执行DJNZ direct, rel ;(direct)-1→(direct),(direct) ≠0转向 PC+2+rel→PC;(direct)=0 ,PC+2→PC顺序执行注意:1)CJNE类指令借用进位标志Cy作为比较结果的标志位。
51单片机指令系统:控制转移类指令(8)51单片机指令系统:控制转移类指令(8)第二十六课:控制转移类指令分析控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB 程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。
[1]. 无条件转移指令(4条)这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。
长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。
LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址)AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值这几条指令,如果要他细分析的话,区别较大,但初学者时,可以不理会那么多,统统理解成LJMP标号,也就是跳转到一个标号处,但事实上,JMP标号,在前面的例程中我们已接触过,并且也知道如何来使用了,AJMP和SJMP也是一样,那么这几条指令它们的区别何在呢?在于跳转的范围不一样。
好比跳远,LJMP一下就能跳64K那么远(当然近了就更没关系了)。
而AJMP最多只能跳2K距离,而SJMP则最多只能跳256这么远,原则上,所有用AJMP或SJMP的地方都可以用LJMP来替代。
因此在初学者时,需要跳转时可以全用LJMP。
但是在查表时要注意会出错,因为他们的机器周期不一样,取得的数也不一样。
51单片机汇编指令集一、数据传送类指令(7种助记符)MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;MOVC(Move Code)读取程序存储器数据表格的数据传送;MOVX (Move External RAM) 对外部RAM的数据传送;XCH (Exchange) 字节交换;XCHD (Exchange low-order Digit) 低半字节交换;PUSH (Push onto Stack) 入栈;POP (Pop from Stack) 出栈;二、算术运算类指令(8种助记符)ADD(Addition) 加法;ADDC(Add with Carry) 带进位加法;SUBB(Subtract with Borrow) 带借位减法;DA(Decimal Adjust) 十进制调整;INC(Increment) 加1;DEC(Decrement) 减1;MUL(Multiplication、Multiply) 乘法;DIV(Division、Divide) 除法;三、逻辑运算类指令(10种助记符)ANL(AND Logic) 逻辑与;ORL(OR Logic) 逻辑或;XRL(Exclusive-OR Logic) 逻辑异或;CLR(Clear) 清零;CPL(Complement) 取反;RL(Rotate left) 循环左移;RLC(Rotate Left throught the Carry flag) 带进位循环左移;RR(Rotate Right) 循环右移;RRC (Rotate Right throught the Carry flag) 带进位循环右移;SWAP (Swap) 低4位与高4位交换;四、控制转移类指令(17种助记符)ACALL(Absolute subroutine Call)子程序绝对调用;LCALL(Long subroutine Call)子程序长调用;RET(Return from subroutine)子程序返回;RETI(Return from Interruption)中断返回;SJMP(Short Jump)短转移;AJMP(Absolute Jump)绝对转移;LJMP(Long Jump)长转移;CJNE (Compare Jump if Not Equal)比较不相等则转移;DJNZ (Decrement Jump if Not Zero)减1后不为0则转移;JZ (Jump if Zero)结果为0则转移;JNZ (Jump if Not Zero) 结果不为0则转移;JC (Jump if the Carry flag is set)有进位则转移;JNC (Jump if Not Carry)无进位则转移;JB (Jump if the Bit is set)位为1则转移;JNB (Jump if the Bit is Not set) 位为0则转移;JBC(Jump if the Bit is set and Clear the bit) 位为1则转移,并清除该位;NOP (No Operation) 空操作;五、位操作指令(1种助记符)CLR 位清零;SETB(Set Bit) 位置1。