在KeilC的选项中,C51这一项里有一项叫做“Don't use absolute register accesses”。我们已经因为这一项出了三次Bug了。
那么这一项有什么作用呢?
在KeilC默认中,这一项并没有选上,表示KeilC将使用寄存器的绝对定位来优化程序。什么意思呢?我们知道,51中有四组通用寄存器。在寄存器组0的时候,R0-R7实际上就映射到了0x01-0x07这段地址。也就是说有时候为了优化,KeilC将会使用0x01-0x07这样的绝对地址。举个简单的例子吧,比如说我们需要将寄存器R5的值存入R7,正常我们会这样写:
MOV A, R5
MOV R7, A
但是如果使用寄存器的绝对定位呢?我们就可以这样写了:
MOV R7, 0x05
节省了一条指令的执行时间!
当然,正常时候这样使用当然没有任何问题。然而,如果有一个中断的服务程序,我们使用了寄存器组1呢?这时候,R5就不再是0x05了,而是0x0D!因此,Bug就出来了。
当然,我们可以在这个中断服务程序上所调用的所有子程序中加在using 1的关键字来解决这个问题。不过这样还是带来了一些不便,更有一些时候,一些子函数是多处调用了。因此,有时我们一般都直接勾选了这个选项来取消KeilC的这项优化。