关于汇编指令的问题

[复制链接]
2735|16
 楼主| qiangdao 发表于 2007-9-5 17:33 | 显示全部楼层 |阅读模式
在程序运行到reti的时候,它并没有跳出中断,而是跳到别的子程序里面;<br />sp乱跳是什么原因引起的请各位大虾帮忙!(程序比较小,大概有1300行)<br />大虾们告诉我大多是什么原因一起sp乱跳的好了~我自己查查
一级菜鸟 发表于 2007-9-5 17:37 | 显示全部楼层

堆栈溢出或者中断内修改了SP

  
zjh006 发表于 2007-9-5 17:43 | 显示全部楼层

这跟汇编指令有什么关系

仔细看看datasheet,这个IC有几层堆栈,再看看你的程序调用了多少层子程序
 楼主| qiangdao 发表于 2007-9-5 21:48 | 显示全部楼层

回2楼:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;谢谢2楼,我再一步一步的检查,我不明白为什么中断回是怎么修改sp的,我的那个就是在运行reti的时候sp&nbsp;没有溢出,就是从84h跳到75h,不知道为什么。<br />回3楼:<br />&nbsp;&nbsp;&nbsp;&nbsp;我本身也怀疑是调用子程序太多会造成,子程序里的嵌套可能有点多(最多有在一个子程序里嵌套了4个其它子程序)。我再看看书,如果还有问题的话望指教
maychang 发表于 2007-9-5 23:04 | 显示全部楼层

RETI指令未正确返回

只可能是堆栈不平衡,或是程序修改了堆栈内容,或是修改了栈针。<br />至于为什么不平衡,或是哪里修改了,那可得仔细找。
computer00 发表于 2007-9-5 23:11 | 显示全部楼层

你怎么知道中断在哪发生的? 或许它的中断点刚好就是你所说

子函数,这样reti到那个子函数,就正好是对的啊。
 楼主| qiangdao 发表于 2007-9-6 08:38 | 显示全部楼层

回5楼

我学单片机没有多久,对于堆栈这一块不怎么清楚,书上关于sp堆栈的介绍也不过是那么一段话,书上有一句话是这么写的:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp的值越小,堆栈的深度越深,最大为128b.<br />我不明白最大为128b是什么意思。还有楼主说的堆栈不平衡我也不明白,怎么判断堆栈平衡与否呢?堆栈是否溢出也该怎么判断?<br />(好不容易逮到楼主,楼主就不惜教育哈吧!小子好好的听着)
 楼主| qiangdao 发表于 2007-9-6 08:42 | 显示全部楼层

回6楼

楼主提的问题我也想过,也试验过。如果程序是全速运行,那我真的找不到是在哪进入的中断,但是我单步运行就知道什么时候进入的中断;最后还是在运行到reti后跑到别的子程序里去,我今天还得一步一步的查。<br />楼主也教育哈小子我吧,对于堆栈的问题我还真的不是一般的‘昏’呢~<br />先谢谢咯
computer00 发表于 2007-9-6 09:16 | 显示全部楼层

首先给你指正一下,你才是楼主。

如果是那样,肯定是你在你的中断服务程序里面,对堆栈操作了,并且是错误的操作,使得堆栈地址错误。例如压栈数和出栈数不一致等。
1121 发表于 2007-9-6 11:31 | 显示全部楼层

检查一下是否中断返回的地址被别的子程序给修改了

或者程序本身有笔误。
 楼主| qiangdao 发表于 2007-9-6 12:25 | 显示全部楼层

回...

回7楼:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嘿嘿~你说的问题好像没有~进出栈的数是对等的,今天早上检查中断的时候都是对的,但是在退出中断时就开始跑了;也许我还没有找对地方昨晚跟今早把程序查了一遍,也许跟8楼的说的,我可能在哪写ret的时候写成reti咯!<br />回8楼:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我不明白别的子程序是如何改中断返回的地址的;中断返回的地址不是由sp来决定的吗?子程序里除了push&nbsp;,&nbsp;pop,lcall,&nbsp;ret指令外其它的好像不影响sp吧!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下午再去检查是不是进出栈没有对等,晚上回来再向大家汇报,望大家再看看
1121 发表于 2007-9-6 15:39 | 显示全部楼层

其它的好像不影响sp?

如果笔误而搞错个间指符号,可以把RAM整个全改了你信不?<br />退出中断时就开始跑,MS实现散转的一种技巧啦。
 楼主| qiangdao 发表于 2007-9-6 22:19 | 显示全部楼层

回11楼...

笔误的话当然会有这个问题~<br />今天搞了大半天,还是你说的那样是子程序把中断的地址改了;但我不知道为什么会出现这种情况:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;sp,#60h<br />&nbsp;(1)&nbsp;&nbsp;&nbsp;lcall&nbsp;&nbsp;&nbsp;delay<br />&nbsp;(2)&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;a,#11h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在(1)的位置处进入中断的话sp为64h,退出中断的话sp为62h,跑到delay里面去了;如果在(2)的位置进入中断的话是62h,退出中断的话为60h,但是不知道为什么它把start&nbsp;的sp&nbsp;改为60h,跳出的话&nbsp;就跑到start程序开始的地方;原来的start的sp为07h;我不知道什么时候把它改了;这个问题搞了好久都没有出来。杀人的心都有了。<br />楼主帮帮忙~<br />&nbsp;&nbsp;&nbsp;&nbsp;
1121 发表于 2007-9-7 08:43 | 显示全部楼层

楼上TX对堆栈和堆栈指针的理解不对。

还有,预留的栈区是不能占用的,除非你明确知道后果而暂时使用。<br />另外,一般进出堆栈的指令是成对使用,除非你明确知道后果(实现散转)。<br />
 楼主| qiangdao 发表于 2007-9-7 10:31 | 显示全部楼层

回14楼

你能不能跟我具体讲讲堆栈呢?我对这块很不理解,先谢谢你咯!<br />堆栈的预留区是什么控制的呢?能跟我讲讲实现散转该怎么写
1121 发表于 2007-9-7 11:27 | 显示全部楼层

TO qiangdao 堆栈的道理可以看书啊。

是什么地方不理解呢?<br />堆栈的预留区可以放在片上RAM的任何一个地方,是个存放地址数据的缓存区。一般都放在高端地址,大小是根据子程序的使用大小来定。尽量要少使用子程序嵌套,也就可以少占用栈区容量了。堆栈指针在程序的初始化部分就要设置好,指示了堆栈的初始地址。<br />堆栈有很多使用技巧,有时可以传递参数;实现条件转移等。用的好,可以减小程序代码量,还可以作为寄存器来灵活使用。散转的技术书上也有,就是跳到不同的子程序后不再返回该子程序。但初学者不建议使用,容易搞乱啊。<br />另外,中断调用的地址是固定的,其他和普通子程序类似。<br />
 楼主| qiangdao 发表于 2007-9-7 16:01 | 显示全部楼层

回16楼

嘿嘿,就是堆栈传递参数和散转;我看的都是入门的书,你说的前半部分明白;后半部分也就是堆栈传递参数和散转我没有接触过,能否指点一二?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

162

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部