keil有bug吗?我怎么不能单步调试?进来看看!

2020-01-30 14:05发布

写了很简单的一个程序,但是查看了反汇编之后,那个函数根本就没有对应的汇编,我设置断点之后,在stepin进去,直接就出来函数了,难道keil有bug?

这是主程序:
void data_tst();

void main()

{
        uint i = 0;
        i = sizeof(uint);
        data_tst();
}

void data_tst(void)
{
        uint temp = 0,yy = 0;
        temp = sizeof(uchar);
        yy = sizeof(uint);
}
下面上图:


我调试时候的图片 (原文件名:keil.JPG)


当单步进入data_tst()函数的时候,汇编是:
C:0x0013    020016   LJMP     data_tst(C:0016)
但是再继续往下执行时 下一条指令是:
C:0x0016    22       RET      
直接就返回了,那我写的函数语句呢???
再往下执行就是 :
C:0x0017    00       NOP      
C:0x0018    00       NOP
C:0x0019    00       NOP
C:0x001A    00       NOP

难道是我的keil版本的问题??



我的keil版本 (原文件名:keil_version.JPG)


大家有遇到过这个问题吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
yuanbangyin
1楼-- · 2020-01-30 14:13
从来没有见过断点设置在最后的右括号上面的,等到执行ret指令的时候,根本不会理会你的中断,直接返回了。
zhuyi25762
2楼-- · 2020-01-30 14:38
从来没有见过断点设置在最后的右括号上面的.哈哈,眼神真好
ohmytime
3楼-- · 2020-01-30 15:44
回复【1楼】yuanbangyin 袁邦银
从来没有见过断点设置在最后的右括号上面的,等到执行ret指令的时候,根本不会理会你的中断,直接返回了。
-----------------------------------------------------------------------

不是这样的,我才不会把断点设置在最后的右括号上面的!!!
void data_tst(void)
{
    uint temp = 0,yy = 0;
    temp = sizeof(uchar);  //我在这一句设置的断点
    yy = sizeof(uint);
}


我是在函数里面设置断点,结果debug的时候,它就成了你看到的样子!
好好看看生成的汇编文件吧

其实我在主函数的某一句设置断点,然后调试的时候在那一句停下。
然后再单步进入data_tst()函数,结果就会直接退出函数的!!
marshallemon
4楼-- · 2020-01-30 19:55
 精彩回答 2  元偷偷看……
ohmytime
5楼-- · 2020-01-31 00:04
回复【4楼】marshallemon
真是牛人,感觉你似乎修改了程序没有编译造成的,重新编译下,再进debug

-----------------------------------------------------------------------

没有啊,我用keil很久了,一切都正常啊,编译好多遍了都,觉得应该没问题的。

难道是win7下不兼容??不会吧,用脚趾头想想都不应该的。
看下面这张图


看看标出的部分 (原文件名:捕获.JPG)

Oh My God !  我的函数里的程序跑哪里去了???
tcp1985
6楼-- · 2020-01-31 00:09
是被编译器优化掉了,这便是volatile的神奇作用了,将子函数的局部变量加入volatile即可了


(原文件名:未命名.jpg)

一周热门 更多>