8051单片机中 pc是PC的跳转问题

单片机跳转指令_百度知道
单片机跳转指令
L2;END这里有几个问题1:假设A=0,则跳转到L1执行,然后按顺序往后面执行,那后面的L2还要不要执行?2:如果执行了L2,那L2:
L2;这条指令是无条件转移到L2,那不是重复无限执行这条指令了吗?
提问者采纳
这是因为调用LCALL后压栈操作所致。
堆栈寄存器SP的值在单片机启动后缺省为07H,也就是说07H+1=08H开始的内部RAM是堆栈区。在你调用LCALL Q11F1后,为了保证执行完Q11F1子程序后程序回到LCALL Q11F1的下一句,单片机会执行压栈操作:下一句指令Q11F1:MOV A,09H在程序中地址是010BH,所以:压栈前:
SP=07H第一次压栈:SP+1=08H:将0BH保存到08H第二次压栈:SP+1=09H:将01H保存到09H这就改变了09H的内容成了01H了。正常情况下,通过RET指令后,将010BH送回给单片机的程序执行指针PC,然后SP-2回到07H。所以再往下执行会有问题:调用LCALL后,通过RET返回,没有问题;但紧跟着又执行Q11F1,又执行了一个RET,此时07H和06H的内容决定了下一条指令从何处开始执行,这是不对的。子程序Q11F1必须经过CALL类调用指令来执行,否则会有问题。本例中LCALL Q11F1执行完后要么回到前面某句循环,要么原地等待。另外SP值一般可以设大点,否则07H之后的空间用不了。
提问者评价
其他类似问题
为您推荐:
单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁深入单片机软复位(PC跳转) - 电子技术基础知识 - 21IC中国电子网
您当前的位置:&>&&>&&>&
深入单片机软复位(PC跳转)
对函数指针熟悉吗?熟悉一切都容易了!
好书推荐《C陷阱与缺陷》《C专家编程》看看就上个档次就不是菜鸟了,呵呵
(*(void(*)())0)&();&&&//就是它了!
晕了吗?没晕,不错不错,大哥,你扎这厉害呢!
((void(*)())0)&();&&&//如果这样写呢!
(**(void(*)())0)&();&&&//如果这样写呢!
有区别吗?看下面例子
#include&stdio.h&
void&fun()
int&main()
&&&&&&&&printf(&%p&&&&&&%p&&&&&&%p &,&&fun,&fun,&*fun);
&&&&&&&&return&0;
看看结果是否大吃一惊&&//&没有,大哥你扎这厉害呀
假设fp是个float指针,声明如下
把0强制转换成一个float指针(把变量fp去掉就可以了)
(float&*)0;
假设fp是函数指针为void类型的函数的指针),声明如下:
void&(*fp)();&&&&&&
把0强制转换成该函数指针(变量fp去掉就可以了)
(void(*)())0
最后用(void(*)())0代替fp,从而得到调用的用法
(*(void(*)())0)&();
单片机我是这样写的
((void(code&*)(void))0x0000)();&&&//简单,证实可以
(*(void(code&*)(void))0x0000)();&&//这样行吗
是不是看的很麻烦,typedef来帮忙呀(为复杂的声明定义一个新的简单的别名),这不这个大哥来了
typedef&void&(code&*pfunction)(void);
//相当于pfunction变成了一个函数指针的类型(和float含义一样,只不过flaot表示的是一个指向浮点的指针,而pfunction表示一个指向函数的指针)
((function)0xE800)();&&&//这样行吗
(*(function)0xE800)();&//这样行吗
下面是我在ARM下用过的
typedef&void&(*pfunction)(void);
&void&FMI_Jump(void)
&&pfunction&
&&jump=(pfunction)(0x80000);
跳转PC,都是用来在线升级时候,什么什么你没用过,大哥你扎这幸运呢,想当初我带着烧写器做火车,一个电信机房一个电信机房的跑,痛苦呀!
注意:跳转复位PC危险!!!!它只是PC从000开始,内部寄存器并未回到复位值,所以程序初始化一定要彻底,一切系统资源都要初始化,哪怕未用!!!建议最好关狗,等RESET复位较安全(什么什么我用PC跳转没遇到问题啊?大哥你扎这幸运呢!^_^)
感谢21ic网友&&zyboy投递。原帖地址:21ic官方微信
后使用快捷导航没有帐号?
查看: 2258|回复: 16
51单片机在程序跳转时为什么只保存PC?
&&已结帖(20)
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
主题帖子积分
专家等级:结帖率:99%
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
51单片机在程序跳转时为什么只保存PC?内部通用寄存器的值会被跳转到的程序破坏掉吗???而UCOS保存的是全部内部公共寄存器的值。。。
我手头上的书上写的是SP是60H-7FH,SP的起点可以向后移动,但必须在60H--7FH之间,是这样的吗?
满意回复+10
谁说51跳转时保存PC了
楼主被操作系统毒害了,建议先研究一段时间汇编,可选方案是用操作系统继续做应用,不要管底层。
汇编是拔光了让你看,C是穿了衣服让你看,操作系统是穿了衣 ...
主题帖子积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
谁说51跳转时保存PC了
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
主题帖子积分
专家等级:结帖率:99%
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
说错了,不是跳转,是调用,CALL,是为什么只保存PC,而不保存其他寄存器呢???
主题帖子积分
初级技术员, 积分 315, 距离下一级还需 -215 积分
初级技术员, 积分 315, 距离下一级还需 -215 积分
主题帖子积分
专家等级:结帖率:85%
主题帖子积分
初级技术员, 积分 315, 距离下一级还需 -215 积分
初级技术员, 积分 315, 距离下一级还需 -215 积分
学习了,,
主题帖子积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
CALL为什么只保存PC,而不保存其他寄存器呢???而UCOS保存的是全部内部公共寄存器的值
别拿一个汇编指令与UCOS比较。把UCOS的代码翻一翻,看看他都干了些什么,用了多少指令。
我手头上的书上写的是SP是60H-7FH,SP的起点可以向后移动,但必须在60H--7FH之间,是这样的吗?
不是。取决于单片机的内部ram空间。
主题帖子积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
中级工程师, 积分 3749, 距离下一级还需 1251 积分
我去……二姨抽了……
主题帖子积分
高级技术员, 积分 883, 距离下一级还需 117 积分
高级技术员, 积分 883, 距离下一级还需 117 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 883, 距离下一级还需 117 积分
高级技术员, 积分 883, 距离下一级还需 117 积分
是为了灵活吧
你想保存其他,那你自己添加得了。
主题帖子积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
我还没有发现哪个MCU在调用程序时会保存PC以外的寄存器
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
主题帖子积分
专家等级:结帖率:99%
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
那程序的调用就好象是在程序里插入另一段程序一样,不用保存公用寄存器(和程序一直执行下来一样)。而操作系统的是程序的切换,是不再回到原程序了,所以要保存公用的寄存器,这样理解差不多。
主题帖子积分
中级技术员, 积分 105, 距离下一级还需 195 积分
中级技术员, 积分 105, 距离下一级还需 195 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 105, 距离下一级还需 195 积分
中级技术员, 积分 105, 距离下一级还需 195 积分
操作系统的为了能够回到被中断的任务所以要把所有的寄存器的值都保存起来,一般程序调用只是简单的程序之间的调用,所以这两种是不一样的。
主题帖子积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
技术总监, 积分 38426, 距离下一级还需 11574 积分
RTOS是用额外程序去实现保存寄存器的
和调用没有关系
这完全是两码事
这好比MCU就那些基本指令,但是却能做各种的事情...
主题帖子积分
主题帖子积分
专家等级:结帖率:84%
主题帖子积分
无语。。。
汽车轮胎为什么不能自己走?看看电动车,都能走能停能载人还有灯油喇叭耶。。。&&很不明白。。。
& & 好久不嚼槟榔
主题帖子积分
主题帖子积分
专家等级:结帖率:97%打赏:0.00受赏:8.00
主题帖子积分
楼主被操作系统毒害了,建议先研究一段时间汇编,可选方案是用操作系统继续做应用,不要管底层。
汇编是拔光了让你看,C是穿了衣服让你看,操作系统是穿了衣服还盖了棉被,当然啥都看不到了。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
《深入浅出AVR单片机》专为新手而著的单片机教程!
详情http://ne5532.21ic.org
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
主题帖子积分
专家等级:结帖率:99%
主题帖子积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
初级工程师, 积分 2330, 距离下一级还需 670 积分
谢谢NE5532,正在研究汇编了,差不多想明白了。操作系统任务切换和ACALL是两个概念。ACALL是任务的调用,只是把PC指向被调函数入口处,调用完返回,这个和C语言里的函数调用是一样的,函数在ROM里面可以放在任何位置,只要找到入口就可以调用,遇到RET函数调用结束了,返回,程序继续向下执行。操作系统的任务是独立的,每个任务都是一端独立的程序,任务切换要保存所用的公用寄存器,这样才能让任务执行的环境不变。而任务间的通讯都要通过事件来控制
主题帖子积分
高级技术员, 积分 786, 距离下一级还需 214 积分
高级技术员, 积分 786, 距离下一级还需 214 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
高级技术员, 积分 786, 距离下一级还需 214 积分
高级技术员, 积分 786, 距离下一级还需 214 积分
设计问题,除非自己设计个mcu,要不然就适应吧
弱水三千,只取一瓢!
主题帖子积分
资深技术员, 积分 384, 距离下一级还需 116 积分
资深技术员, 积分 384, 距离下一级还需 116 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 384, 距离下一级还需 116 积分
资深技术员, 积分 384, 距离下一级还需 116 积分
那你看的是哪本书啊?》
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
突出贡献奖章
等级类勋章
沉静之湖泊
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
技术高手奖章
人才类勋章
终身成就奖章
等级类勋章
涓涓之细流
发帖类勋章
热门推荐 /2C与汇编的混合编程C语言通过 _asm{}来直接在代码嵌入汇编,有底层驱动时,为了效率,经常直接嵌入式汇编,一但使用ASM,你程序的可移植性就大大减弱了,这是开发者要注意问题C++引用C的函数库C++引用C的库函数,必须要对C的库函数用, extern "C"对函数数声明进行修饰...
正在载入,请稍候...
最近登陆的会员
C与汇编的混合编程C语言通过 _asm{}来直接在代码嵌入汇编,有底层驱动时,为了效率,经常...
由串行口接收带偶校验位的ASCII码数据块。 设待接收数据块共10H个字节,接收后拟存于...
功能:比较二个字节中的值,若不等,则转移。 CINE A , #data , rel CJNE A , dire...
与 ROM 之间的数据传送。 MOVC A , @A + DPTR MOVC A, @A + PC 执行后会使 /PSEN 有...
设计 89C51 和 ADC0809 的接口,采集 2 通道 10 个数据,存入内部 RAM 的 50H~59H 单...
设单片机采用 8051 ,未扩展片外 ROM ,片外 RAM 采用一片 6116 ,编程将其片内 ROM ...
友情链接 请先做好本站链接,再申请!谢谢!

我要回帖

更多关于 8051单片机中 pc是 的文章

 

随机推荐