***********深入理解c51的程序计数器(pc)的入栈情况***********

softpepol 2005-03-02 08:36:57
老师:
您好!
在调用子程序和中断发生时,都会将记载原程序下一条指令地址的pc中的内容压入栈。而我要编的程序需要我深入理解这个pc入栈情况,我的问题是:
1、入栈时,是先将指令地址的高8位压入还是低8位?
2、子程序和中断发生时,除了压入pc还压入别的内容吗?

谢谢!
...全文
584 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
W32API 2005-03-18
  • 打赏
  • 举报
回复
跟我说的? 让我看什么?
我没教科书。哪里会知道你说什么书。

我经常会使用
union
{
BYTE ByteArray[32];
WORD WordArray[16];
DWORD DWordArray[8];
}idata IICBuf; // IIC data buffer
作为临时存储区。
除了必须的,其他的参数都是重新 init(or load) 的。
至于所谓的 kernel,一般都会根据项目要求将任务去分多个步骤,当然算是靠点分时系统的边吧。
同时需要在 RAM 中的东西并不太多。 100 个 RAM 的需求我很少碰到。
32 K 以下的 CODE 很少会使用超过 100 个 RAM 的空间。
Jinkan_zhong 2005-03-17
  • 打赏
  • 举报
回复
你到是看了没啊,你是什么专业咯。
Jinkan_zhong 2005-03-12
  • 打赏
  • 举报
回复
上面的说的也是可是我们现在的教科书就是这样的咯,什么东西都要记的
W32API 2005-03-11
  • 打赏
  • 举报
回复
用 51 没有必要这么频繁的使用堆栈吧。
建一个 buffer[] 然后用之作为临时存储区。自己管理。
另外就是不要跟我说你要做得象操作系统那么严格,浪费时间。
Jinkan_zhong 2005-03-10
  • 打赏
  • 举报
回复
现在网上有51系列的模拟器,你可以搜索下载自己调试,我的学校主页好象有专业的下载,但是我没有去看,而且我的学校的教学要求是给我们学生每个学生一块模拟板,调试板子的好坏还要用这个板子调试一个系统,我遇到这个就狂晕…………
Jinkan_zhong 2005-03-10
  • 打赏
  • 举报
回复
其实大家都在象他这样也象我这样的小弟,我现在也在学单片机。对于你说的问题一是:先入栈低八位,后入栈高八位,当然这是对于在@dptr类咯,至于说的只是8位机我想上面的那位大虾说的不是很严谨的,现在的教材可不是说只有8位机咯,十五计划的教材就提到16位机还说了挺多的,
问题二是:如果你的是子程序的调用和中断源中断的话就取决于你现在的单片机的外部存储选通的信号是不是已经打开,如果是打开的那么你的栈除了压入当前的各种寄存器(比如PSW中的状态寄存器等)的数据,还有就是当前的外部存储器的统一编址的地址,这样的话可以初步的保护好中断现场,也就是我们常说的数据入栈保护就是你说的除PC入栈之外的东西;如果是在外部存储没有选通的话就不同的PC入栈其他的大概相同。
但是你一定要记得的是:8031里没有ROM,它的外部存储选通引脚是必须是接+5V的高电平才可以对外使用ROM进行程序的存储。
shen_guang_wu 2005-03-10
  • 打赏
  • 举报
回复
由编译器自动完成要好些,只是一定注意,变量不能和堆栈冲突了
weizsu 2005-03-08
  • 打赏
  • 举报
回复
同意楼上的,除非是高档的产品,或是任务多且实时性强,否则不必kernel的
goodluckyxl 2005-03-08
  • 打赏
  • 举报
回复
入栈传递参数很危险,我用汇编倒是偶尔这么用。
-------------
可以考虑用宏入栈传递
clementzhao 2005-03-08
  • 打赏
  • 举报
回复
入栈传递参数很危险,我用汇编倒是偶尔这么用。
goodluckyxl 2005-03-08
  • 打赏
  • 举报
回复
push dpl
push dph

pop dph
pop dph

icesnows 2005-03-03
  • 打赏
  • 举报
回复
应该是低8位先进去
除压入PC,如果是C语言的参数传递的话,会压入别的内容
同意楼上的,写个测试程序,一看就明了
Great_Bug 2005-03-03
  • 打赏
  • 举报
回复
对不起,漏了一个字,应当是“很残酷”。
Great_Bug 2005-03-03
  • 打赏
  • 举报
回复
如果需要在设计中使用一个 kernel,需要清晰的知道堆栈的布局。尤其是,当中断发生时,堆栈是什么样子。
但我觉得,在51上使用一个 kernel 实在是很勉强,现在有更好的选择,比如 ARM。除非对成本的要求特别严格。 使用一个价值10元钱的 MCU 开发产品,还要嵌入一个 kernel, 实在是很酷。
weizsu 2005-03-03
  • 打赏
  • 举报
回复
c51 不用堆栈传递参数,这样讲不是很严谨。我们用的KEIL的编译器是这样的。不同公司有差别。
Great_Bug 2005-03-03
  • 打赏
  • 举报
回复
通常,c51 不用堆栈传递参数,你的函数不需要处理这些问题。

参数通过寄存器传递,或者通过固定的地址传递。

有一个例外,如果你定义可重入的函数,则参数通过堆栈传递。但c51默认是生成不可重入的函数。
ldqmoon 2005-03-03
  • 打赏
  • 举报
回复
有的书上有写,可以找找看
weizsu 2005-03-02
  • 打赏
  • 举报
回复
1.对于51来说,因为是8位机,所以不存在ENDIAN的问题,指令地址的低八位先入栈。
2.我记得如果有参数传递的话,就会压入其他的内容
建议不用看的这么细,照着例子写一个,然后看编译的结果,(一般的开发工具都有这个功能)比如汇编指令或是机器命令,就会了

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧