打印

关于51中断地址

[复制链接]
2311|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ruiwei0201|  楼主 | 2009-8-12 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
s46410864| | 2009-8-12 11:48 | 只看该作者
地址是绝对的,什么000B.0013.001B.一共五六个.
就如汇编所写
org 0000h
ajmp  start
org 000Bh
ajmp  L
...
这个...那个..嗯..大约..可能...就是这样了

使用特权

评论回复
板凳
ruiwei0201|  楼主 | 2009-8-12 11:59 | 只看该作者
多谢LS的指点。我现在的问题是这样,我有两个程序(或者说是两个BIN文件),一个是loader(这个要占用了0地址),另一个是应用程序(在非0地址),如果在应用程序里要使用中断的话该如何做呢?

使用特权

评论回复
地板
zyboy| | 2009-8-12 15:47 | 只看该作者
必须将应用程序的中断向量部分映射到0x0003之后,就是对第一个扇区进行新的中断映射

复位0x0000-0x0003 地址保存 LJMP main 命令
例如
C:0x0000    02F741   LJMP     STARTUP1(C:F741)
0x0000 – 0x0003 存储的就是 02F741 ,其中02是LJMP命令码,F741是跳转地址(main),其实也不是


main的地址,在main之前,还保护堆栈初始化等代码(通过汇编可以看到)。

0x0003之后的是各种中断的地址,比如你的程序中
void SMBUS_ISR (void) interrupt 7
{
}
SMBUS_ISR这个SMBUS中断函数的地址就保存在0x003B处

一个程序实际上就是由中断向量部分  + 用户代码程序构成
其中中断向量是在第一个扇区内

对于KEIL来说,除非特别指定函数地址,在编写完程序后,编译器会自动分配函数的地址,也就说改动编译后,中断向量中的地址都可能发生改变

对于KEIL,可以指定程序代码的位址,但这个位址是用户代码地址。
例如 在Option For Target -BL Loate - code Range 0XEA00-0XFDFF

使用特权

评论回复
5
czdo| | 2009-8-12 16:00 | 只看该作者
学习了,谢谢

使用特权

评论回复
6
turmary| | 2009-8-12 20:05 | 只看该作者
用函数指针咯

使用特权

评论回复
7
ruiwei0201|  楼主 | 2009-8-13 09:15 | 只看该作者
多谢各位关注,偶心中已有些眉目了。

使用特权

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

本版积分规则

28

主题

149

帖子

0

粉丝