打印

以下指令是否实现读取SP指针的值呢?

[复制链接]
4092|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxb1717|  楼主 | 2012-12-7 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下几句语句是为了定位有问题的代码,我现在不知道哪段代码有问题,会导致看门够复位,我想在中断里把进入中断前的指令地址读出来,这样就能找到复位前的执行的语句,以下几句汇编可否实现呢,请懂汇编的朋友帮忙看一下,
***************************************************
MOV                R0,SP
LDR                R1,=reset_command_SP       
STR                R0,[R1]                ;将R0中的值存到R1所指定的地址中       
****************************************************
我做实验发现reset_command_SP=0x400030e8;

reset_command_SP=0x400001f4;
但是这几个值在汇编窗口找不到对应语句的地址,不知道哪里错了,大家能否给个建议啊。
评分
参与人数 1威望 +1 收起 理由
wonderqu + 1 赞一个!

相关帖子

沙发
望断云山| | 2012-12-7 11:30 | 只看该作者
读取sp,看手册,根据手册的说法进行修正,按修正值可从堆栈中找到地址

使用特权

评论回复
板凳
jlass| | 2012-12-7 11:31 | 只看该作者
哪段代码有问题,会导致看门够复位

这种问题没必要改内核吧,查查寄存器就好了啊

使用特权

评论回复
地板
望断云山| | 2012-12-7 11:36 | 只看该作者
前面的回答我以为我理解了你的意图,仔细一想看门狗造成复位,堆栈中因该没有复位前的地址吧,不管是什么芯片都是这样吧。我觉得我还是不理解你的问题。

使用特权

评论回复
5
zxb1717|  楼主 | 2012-12-7 12:01 | 只看该作者
望断云山 发表于 2012-12-7 11:36
前面的回答我以为我理解了你的意图,仔细一想看门狗造成复位,堆栈中因该没有复位前的地址吧,不管是什么芯 ...

先谢谢你的回答,是这样的,比如我现在看门狗复位周期设置在5秒,在看门狗复位前一段时间里我设立了一个变量,一旦这个变量等于1,说明程序一直在执行某个任务里的代码出不来了,这时意味着超时复位将要发生,但还没发生,这个时候我就想在定时器中断里通过通过读取SP,PC,LR三个寄存器的值来定位有问题的语句,不知道这样表达清楚了没有?

使用特权

评论回复
6
望断云山| | 2012-12-7 12:30 | 只看该作者
zxb1717 发表于 2012-12-7 12:01
先谢谢你的回答,是这样的,比如我现在看门狗复位周期设置在5秒,在看门狗复位前一段时间里我设立了一个 ...

如果能保证发生定时中断,在进入定时中断后,根据芯片手册,硬件自己压了多少字节进栈,就将sp的值修正多少字节的偏移,这个值指向的就应该是硬件自己压进栈的数据,里面自然有pc值

使用特权

评论回复
7
zxb1717|  楼主 | 2012-12-7 12:44 | 只看该作者
望断云山 发表于 2012-12-7 12:30
如果能保证发生定时中断,在进入定时中断后,根据芯片手册,硬件自己压了多少字节进栈,就将sp的值修正多 ...

我读取到的SP是0x4000XXXX,前后偏移多少字节都不着边啊,我觉得0x4000XXXX更像是某个变量的地址

使用特权

评论回复
8
zxb1717|  楼主 | 2012-12-7 12:46 | 只看该作者
我读取到的三个寄存器的值分别是SP=0x400030e8,LR=0x0003fcac,PC=0x0002eaac,其中LR和PC都能找到相关代码,就是当前正在执行的地址,但是0x400030e8不知道到哪去了,挨不着边,该怎么定位呢?

使用特权

评论回复
9
zxb1717|  楼主 | 2012-12-7 12:52 | 只看该作者
或许是我的方法不对,我是在进入定时器中断的时候读取的三个寄存器的值

使用特权

评论回复
10
airwill| | 2012-12-7 13:01 | 只看该作者
看了半天才明白这是将的 ARM 的核呀.
直接在看门狗中断里, 读取堆栈中压入的 PC 的地址就是了

使用特权

评论回复
11
望断云山| | 2012-12-7 13:10 | 只看该作者
sp中的值就是一个指针指向的是目前的栈顶

使用特权

评论回复
12
zxb1717|  楼主 | 2012-12-7 13:31 | 只看该作者
airwill 发表于 2012-12-7 13:01
看了半天才明白这是将的 ARM 的核呀.
直接在看门狗中断里, 读取堆栈中压入的 PC 的地址就是了 ...

不好意思,一开始我没讲清除,我用的是LPC21xx,我没有用到看门狗中断,喂狗指令是在定时器中断里执行的,定时器中断频率为1ms,这样在定时器中断里可以读取压入的 PC 的地址么?

使用特权

评论回复
13
zxb1717|  楼主 | 2012-12-7 13:33 | 只看该作者
望断云山 发表于 2012-12-7 13:10
sp中的值就是一个指针指向的是目前的栈顶

嗯,这个我知道,但是根据SP的值来推算LR或者PC的值,然后根据推算出来的值去找代码地址,根本不对啊,比如我的代码段在0x0003fd3c,那如果根据SP的值来计算PC的值,那都是在0x4000XXXX附近,差的太远了,不知道哪里搞错了,能否解释一下啊,谢谢各位

使用特权

评论回复
14
zxb1717|  楼主 | 2012-12-7 13:36 | 只看该作者
难道这几个寄存器的值只能在看门狗中断里读???????????
在定时器中断里读到的没意义??

使用特权

评论回复
15
airwill| | 2012-12-7 14:47 | 只看该作者
zxb1717 发表于 2012-12-7 13:36
难道这几个寄存器的值只能在看门狗中断里读???????????
在定时器中断里读到的没意义?? ...

难道这几个寄存器的值只能在看门狗中断里读?????    这里让人越看越糊涂你到底想干什么了
还是回到标题里的问题: "中断里把进入中断前的指令地址读出来,"
解决这个问题就只要读堆栈里的数据就可以了.  
怎么读, 偏移地址是多少, 请去看 " ARM 技术参考手册" 的相关说明吧

使用特权

评论回复
16
zxb1717|  楼主 | 2012-12-7 15:04 | 只看该作者
airwill 发表于 2012-12-7 14:47
难道这几个寄存器的值只能在看门狗中断里读?????    这里让人越看越糊涂你到底想干什么了
还是回到标题里 ...

先谢谢你的耐心解答。如题所说,我就是想定位进入中断前程序走到哪,至于“只要读堆栈里的数据就可以了”,我已经在13楼说过情况了,SP应该是指向栈顶的吧,但是算出来的值和代码地址不着边际啊,哪里错了呢?

使用特权

评论回复
17
zxb1717|  楼主 | 2012-12-7 15:05 | 只看该作者
airwill 发表于 2012-12-7 14:47
难道这几个寄存器的值只能在看门狗中断里读?????    这里让人越看越糊涂你到底想干什么了
还是回到标题里 ...

是不是我在定时器中断里读取堆栈的方法不对呢?

使用特权

评论回复
18
zxb1717|  楼主 | 2012-12-7 15:11 | 只看该作者
airwill 发表于 2012-12-7 14:47
难道这几个寄存器的值只能在看门狗中断里读?????    这里让人越看越糊涂你到底想干什么了
还是回到标题里 ...

int  Timer0Isr()
{
/*********************************************************************/
__asm                                         //在此添加汇编读取堆栈指针SP的值
          {
          MOV                R0,SP
          LDR                R1,=reset_command_SP        
          STR                R0,[R1]                ;将R0中的值存到R1所指定的地址中  
     }
/*********************************************************************/
}
以上代码不知道能否实现如题要求呢?

使用特权

评论回复
19
airwill| | 2012-12-7 15:47 | 只看该作者
zxb1717 发表于 2012-12-7 15:04
先谢谢你的耐心解答。如题所说,我就是想定位进入中断前程序走到哪,至于“只要读堆栈里的数据就可以了” ...

"SP应该是指向栈顶的吧"
是的, 但按照偏移地址去取数据也有可能会有错误, 原因是:
当你在取数据的时候, 又发生了堆栈压栈操作. 也就是说, 从进入中断(这时候压栈8个寄存器)到你取数据时, 有可能又有寄存器压栈了, 这时候, 偏移地址就会有错误了.

使用特权

评论回复
20
qqlvjh| | 2012-12-8 10:54 | 只看该作者
reset_command_SP应该是复位时候定义的SP的初始值,就好比是MCS51汇编中尼第一次要设定的SP,需要你自己设定,而reset_command_SP是根据内存地址和链接文件编译器来设定的,觉得应该是这样。也许不对。

使用特权

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

本版积分规则

31

主题

231

帖子

1

粉丝