打印

关于汇编指令的问题

[复制链接]
1924|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiangdao|  楼主 | 2007-9-5 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
一级菜鸟| | 2007-9-5 17:37 | 只看该作者

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

使用特权

评论回复
板凳
zjh006| | 2007-9-5 17:43 | 只看该作者

这跟汇编指令有什么关系

仔细看看datasheet,这个IC有几层堆栈,再看看你的程序调用了多少层子程序

使用特权

评论回复
地板
qiangdao|  楼主 | 2007-9-5 21:48 | 只看该作者

回2楼:
      谢谢2楼,我再一步一步的检查,我不明白为什么中断回是怎么修改sp的,我的那个就是在运行reti的时候sp 没有溢出,就是从84h跳到75h,不知道为什么。
回3楼:
    我本身也怀疑是调用子程序太多会造成,子程序里的嵌套可能有点多(最多有在一个子程序里嵌套了4个其它子程序)。我再看看书,如果还有问题的话望指教

使用特权

评论回复
5
maychang| | 2007-9-5 23:04 | 只看该作者

RETI指令未正确返回

只可能是堆栈不平衡,或是程序修改了堆栈内容,或是修改了栈针。
至于为什么不平衡,或是哪里修改了,那可得仔细找。

使用特权

评论回复
6
computer00| | 2007-9-5 23:11 | 只看该作者

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

子函数,这样reti到那个子函数,就正好是对的啊。

使用特权

评论回复
7
qiangdao|  楼主 | 2007-9-6 08:38 | 只看该作者

回5楼

我学单片机没有多久,对于堆栈这一块不怎么清楚,书上关于sp堆栈的介绍也不过是那么一段话,书上有一句话是这么写的:
        sp的值越小,堆栈的深度越深,最大为128b.
我不明白最大为128b是什么意思。还有楼主说的堆栈不平衡我也不明白,怎么判断堆栈平衡与否呢?堆栈是否溢出也该怎么判断?
(好不容易逮到楼主,楼主就不惜教育哈吧!小子好好的听着)

使用特权

评论回复
8
qiangdao|  楼主 | 2007-9-6 08:42 | 只看该作者

回6楼

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

使用特权

评论回复
9
computer00| | 2007-9-6 09:16 | 只看该作者

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

如果是那样,肯定是你在你的中断服务程序里面,对堆栈操作了,并且是错误的操作,使得堆栈地址错误。例如压栈数和出栈数不一致等。

使用特权

评论回复
10
1121| | 2007-9-6 11:31 | 只看该作者

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

或者程序本身有笔误。

使用特权

评论回复
11
qiangdao|  楼主 | 2007-9-6 12:25 | 只看该作者

回...

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

使用特权

评论回复
12
1121| | 2007-9-6 15:39 | 只看该作者

其它的好像不影响sp?

如果笔误而搞错个间指符号,可以把RAM整个全改了你信不?
退出中断时就开始跑,MS实现散转的一种技巧啦。

使用特权

评论回复
13
qiangdao|  楼主 | 2007-9-6 22:19 | 只看该作者

回11楼...

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

使用特权

评论回复
14
1121| | 2007-9-7 08:43 | 只看该作者

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

还有,预留的栈区是不能占用的,除非你明确知道后果而暂时使用。
另外,一般进出堆栈的指令是成对使用,除非你明确知道后果(实现散转)。

使用特权

评论回复
15
qiangdao|  楼主 | 2007-9-7 10:31 | 只看该作者

回14楼

你能不能跟我具体讲讲堆栈呢?我对这块很不理解,先谢谢你咯!
堆栈的预留区是什么控制的呢?能跟我讲讲实现散转该怎么写

使用特权

评论回复
16
1121| | 2007-9-7 11:27 | 只看该作者

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

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

使用特权

评论回复
17
qiangdao|  楼主 | 2007-9-7 16:01 | 只看该作者

回16楼

嘿嘿,就是堆栈传递参数和散转;我看的都是入门的书,你说的前半部分明白;后半部分也就是堆栈传递参数和散转我没有接触过,能否指点一二?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

162

帖子

1

粉丝