C51语言中使用using时应注意的问题

来源:本站
导读:目前正在解读《C51语言中使用using时应注意的问题》的相关信息,《C51语言中使用using时应注意的问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《C51语言中使用using时应注意的问题》的详细说明。
简介:51单片机中断时使用using有时会出现一些很不易被发现的错误,这与所使用的寄存器组有关。

51单片机中断程序中用上using可以精简代码,节省堆栈,不过有时会出现一个问题:

用上using,在中断服务程序里调用函数要小心一点,因为keilC有时会产生依赖绝对地址的代码,例如如下函数,功能是从片外的存储设备中读取一个字节:

ucharReadByte(ucharaddress)

{

retrunPBYTE[address];

}

会被编译成如下代码:

MOVR0,0x07

MOVXA,@R0

MOVR7,A

这时,如果在中断服务程序里调用ReadByte(0xAA);就会发现读出的数据根本不对,因为using1使得中断服务程序在调用函数时使用第一组寄存器传递参数,编译器生成的代码如下:

MOVR7,#0xAA

LCALLReadByte

而ReadByte这个函数的代码是使用绝对地址为0x07的第0组寄存器的R7来传递参数的,所以会出问题。

解决方法是在定义ReadByte这个函数的前面加上"#pragmanoaregs",这样编译器就会生成不依赖于绝对地址的代码了,函数ReadByte被编译生成的代码如下:

XCHA,R0

MOVA,R7

XCHA,R0

MOVXA,@R0

MOVR7,A

这样就可以大胆的使用using了,使用using才是充分利用51架构的使用方法。

提醒:《C51语言中使用using时应注意的问题》最后刷新时间 2024-03-14 01:08:48,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《C51语言中使用using时应注意的问题》该内容的真实性请自行鉴别。