哥们,如果你认真分析了反汇编代码,就不会觉得奇怪了——当然了,这反汇编出来的东西太邪门了——我还真没想过会有这种状况.....
假设有0号中断,啥事都没有,为何,因为从0003H开始的地方,放置了它。
而000BH很自然地放了1号Isr。可是,如果我关了0号中断Isr,这个时侯就会有一个很邪门的现象,它居然把1号Isr放在0003H的地方(以你写的这么简单的Isr的话)
也就是说,这家伙 占了人家0号的地址。
这邪门的现象,我曾经猜测过因为你没有加一个C51的STARTUP.a51头文件导致的,可是,我自己做了一次以后,发现,还是没用,一个邪门样。
后来,我猜测,可能是因为你这个试验性质的中断函数Isr都比较简单,都可以在8个字节内安排完,就是说太短了....
我立马把1号中断乱写了一通,长了许多,然后在关掉0号的前提下,再反汇编一次。
这个时侯,我见到更邪门的事情,不过也因此确定了自己的猜测——
1号下去了,老老实实回到自己的000BH,可是,2号中断却跑上去了......
也就是说,一般来说,我最痛恨的软件自作聪明的现象出现了——如果我们不一板一眼地——比如说,地把没用到的0号中断Isr做成一个空函数,又恰好遇到那个短命的Isr,它会自个从0003这个位置开始,占了人家的门面。
然后呢,它就在自己原来的000BH位置安排一条指令回到0003H.....
事情没完,更恐怖的事情还有.....
那么,原来的0003H,如果安排完那个抢占民居的1号还是没用完咋办呢,完了完了,那就真的完了.....
接下去,比如你的,它只用到0006H的位置就安排完了1号中断,这个时侯它从0007H开始继续安排2号,3号......
所以,我开始逐个查看每个中断入口地址的时候,看到后边那个括号,指向 什么0003,0007的时候,我差点以为自己见鬼了......
结论之:
当你有一个没有使用的中断函数时,这个时侯,它的中断入口处于任由编译器蹂躏的状态,轻则,误入别人的家门,重则,会把后边几家的家门全弄完了——
典型的另我最痛恨的“软件自作多情”。
PS:更加有点恐怖的事情是,我发现,即便留个空函数,这种情况仍然会发生!!!
除非,中断函数写得比较长,长到它不够放在没用的中断入口里,才不会出现这种情况。
这个发现倒是我始料未及的,求各位大大真相
后来我想了想,假如说留空依然会惨遭蹂躏,而加了一句简单的给P2赋值则没事,那如果我真的啥都不想干咋办内?我想,可以加个空语句吧,于是我就加了一句,没用,不死心,两句,还没用,我日,,加3个,居然有用了——
当然我得说,我用的是uVersion 4,这家伙太聪明了,也太自作聪明了,只有我用了3个的时候,它才以为我是想延时?——去他的,它不知道,我只不过想留住自己的家门!! |