调试Atmega16,将程序下载到芯片单步运行,发现调用子函数时压栈的并不是下一条语句的地址,但能正确返回。这是什么缘故?在IAR for AVR和AVR
Studio下均有此问题。比方说
地址 代码
0x198 call USART_Init
0x19C ...........
在进入USART_Init时,应该把0x19C压栈,但硬件仿真时实际压栈的值是0x20CE,
不知道这个是怎么来的?
call USART_Init
如何写的,汇编的堆栈处理,不是自动的吧?
大哥 你这条语句 你想想是要占用几个字节 是不是 一条call语句你去看看要占几个字节
我没有遇到过类似问题 或者遇到了也没注意到 楼主是个很细心的人 值得学习 至于这个问题 我比较支持“板凳”那楼的 如果这样的思路符合实际的话 那么你0x19C 后的命令 它的压栈地址也将不是你后来再定义的地址 除非 你的地址大于等于以上语句占用的总字节
[ 本帖最后由 闫平 于 2009-12-1 10:22 编辑 ]
回复 沙发 qushaobo 的帖子
堆栈处理是自动完成的。
回复 板凳 gavin84xu 的帖子
call 语句占四个字节。
官方答案:
这种偏移量的正常,这是由于硬件仿真器的设计机制决定的。不只是ATMEL的仿真器存在这样的情况,其它的也存在这样的情况。
但是为什么要加0x2000,而不是其它数值,这涉及仿真器的设计的内部信息,是不对外公开的。
其他的也存在这种情况?哪些?我用过J-LINK,没有这种情况。