• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

C8051高手帮我看看这个问题

1、小弟现在在学习C8051单片机,芯片是C8051cF310,用KEIL C51开发.现在很奇怪C程序编译后main()的地址分配从0x0003开始,书上说中断入口的地址从0x0003到0x00AB,这样就把中断向量地址占去了.需要怎么设置吗?
2、还有51工作寄存器的问题,资料说函数的参数、返回值、局部变量地址都会保存在工作寄存器组,还有函数跳转的时候也是把局部变量保存在工作寄存器组,而很多函数可以共用一个工作寄存器组,这样空间不够怎么办?
3、函数跳转的时候局部变量的保存一般会用软堆栈作入栈出栈,C8051是否用寄存器保存局部变量?
4、如果是从函数跳转到中断,因为不确定是从哪个函数跳转,怎么写局部变量的保存?
全部回复(8)
正序查看
倒序查看
2008-04-01 00:16
1,可能你没有开中断.
2,不会很多呀,函数退出后会释放.可能用外部变量,指针,数组;
3,是用堆栈的;
4,系统自己安排的.
0
回复
gugu_1982
LV.3
3
2009-02-23 17:09
我想应该在主函数前加个开始语句吧,跳过中断入口地址,像这样:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:......
中断不管开不开都尽量不占用,避免一起误操作.
0
回复
abing
LV.8
4
2009-02-27 10:40
@gugu_1982
我想应该在主函数前加个开始语句吧,跳过中断入口地址,像这样:ORG0000HAJMPMAINORG0030HMAIN:......中断不管开不开都尽量不占用,避免一起误操作.
虽然没用过,但我想因为是没用中断的原因所以分配在那个地址上了,这样可以减小资源浪费嘛.

另:我不知在c里是否可以定义一个函数的实际地址?就算可以又有什么意义呢?
0
回复
gugu_1982
LV.3
5
2009-03-01 16:51
@abing
虽然没用过,但我想因为是没用中断的原因所以分配在那个地址上了,这样可以减小资源浪费嘛.另:我不知在c里是否可以定义一个函数的实际地址?就算可以又有什么意义呢?
c里应该不能吧,但汇编可以,我也不太懂了,刚刚学习
0
回复
xing1234
LV.6
6
2009-03-04 22:34
@gugu_1982
c里应该不能吧,但汇编可以,我也不太懂了,刚刚学习
老大,这些问题交给编绎器去做,为什么要开发编绎器?就是简化我们工作的,少操点心,你的这些问题编绎器全帮你做了.不用你管,全自动分配并保存
0
回复
gugu_1982
LV.3
7
2009-03-06 11:13
@xing1234
老大,这些问题交给编绎器去做,为什么要开发编绎器?就是简化我们工作的,少操点心,你的这些问题编绎器全帮你做了.不用你管,全自动分配并保存
汇编会自动分配地址吗?这些我还真不懂,劳您指教了
0
回复
abing
LV.8
8
2009-03-06 19:32
@gugu_1982
汇编会自动分配地址吗?这些我还真不懂,劳您指教了
我想第六贴应指C编译器.
不知何时我已把汇编忘得差不多了,为何还要用汇编?有这个心要不?

如果需要一个变量"i",我们不需要关心这个变量存在那个地方,只知道有这个变量就行了.
如:
{
unsigned char i,j,k;  //定义三个变量
i=read_adc(0);
j=reda_adc(1);
k=i+j;
out(k);
}
在程序中我们不需要知道变量存在的地址在哪,就算知道了也用不着,我们只需要结果就可以了.

汇编我认为最适合初学单片机并且是没学过C语言与自学的人.
0
回复
xing1234
LV.6
9
2009-03-09 17:49
@abing
我想第六贴应指C编译器.不知何时我已把汇编忘得差不多了,为何还要用汇编?有这个心要不?如果需要一个变量"i",我们不需要关心这个变量存在那个地方,只知道有这个变量就行了.如:{unsignedchari,j,k;  //定义三个变量i=read_adc(0);j=reda_adc(1);k=i+j;out(k);}在程序中我们不需要知道变量存在的地址在哪,就算知道了也用不着,我们只需要结果就可以了.汇编我认为最适合初学单片机并且是没学过C语言与自学的人.
谢谢楼上的解释,支持一下,楼主的主题是C.现在8位单片机的ROM和RAM已经做得很大,并且可以选择的型号也很多.在8位机能应用的领域,基本上资源都够用.在能用C的情况下极少再用汇编,这是我的个人看法,有不当之处海函.
0
回复