打印

51汇编程序跑飞问题

[复制链接]
1108|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengwuyu111|  楼主 | 2018-3-25 00:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dengwuyu111 于 2018-3-25 12:34 编辑

在学习汇编的过程中遇到了一个问题,没有思路,前来论坛求救。

现象:程序在仿真时进入中断后跑飞。
部分代码:

ORG 0033H        
Timecount DATA 40H        


中断代码:
T0inter:
        MOV SP,#041H               
        PUSH ACC
        PUSH PSW
        
        INC Timecount;
        MOV TH0,#60        ;50mS interrupt.
        MOV TL0,#176
        
        POP PSW
        POP ACC
        
        RETI
END

经过排查原因是在40H处定义了Timecount , 同时在中断中令SP=41H  这两个地方造成了跑飞,
把SP地址改成42H或者把Timecount定义在50H 程序就正常运行。

。实在想不通为什么ROM 在41H 怎么会被占用了。  当SP=42H时 在仿真过程查看ROM的内容,确实41H内的数值确实在变动。

请各位帮忙分析分析

---------------------------
更正,确实都是在RAM里。描述错了。
经过楼下指点,原因确实是因为在程序中设置了SP的值,导致退出中断时程序找不到 中断现场地址导致了程序跑飞。
SP时应在程序最初初始化时设置。

相关帖子

沙发
lyjian| | 2018-3-25 08:28 | 只看该作者
Timecount DATA 40H  
*****
这是在RAM 40H地址,不是ROM。
T0inter:
        MOV SP,#041H
*****
中断中修改SP,把返回地址丢了。

使用特权

评论回复
板凳
linqing171| | 2018-3-25 10:19 | 只看该作者
MOV SP,#041H                把这句删了吧。RETI的时候,还有用进入中断之前在@sp--的地址存的返回值呢。
单片机初始化的时候把sp设置大一点就可以了。

使用特权

评论回复
地板
ddllxxrr| | 2018-3-25 18:30 | 只看该作者
MOV SP,#041H 这块肯定有毛病,去掉即可

使用特权

评论回复
5
ayb_ice| | 2018-3-26 08:38 | 只看该作者
中断强行修改堆栈指针,不飞才怪

使用特权

评论回复
6
ningling_21| | 2018-3-26 16:55 | 只看该作者
SP不要随便改

使用特权

评论回复
7
高勇| | 2018-3-27 08:43 | 只看该作者
榔主是在写操作系统吗?

使用特权

评论回复
8
airwill| | 2018-3-27 19:58 | 只看该作者
首先, 中断修改 SP 的操作, 如楼上各位所讲, 确实是错误的.

就是论事.
MOV SP,#041H  
...
RETI

要知道这最后这条指令会从堆栈从取出返回地址(两个字节), 导致中断返回后 SP 为 #3FH 了

使用特权

评论回复
9
zqx1000| | 2018-4-10 08:48 | 只看该作者
不错,思路很清晰。

使用特权

评论回复
10
sum123456| | 2018-4-11 13:45 | 只看该作者

要知道这最后这条指令会从堆栈从取出返回地址(两个字节), 导致中断返回后 SP 为 #3FH 了

使用特权

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

本版积分规则

11

主题

146

帖子

2

粉丝