|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
c51在进入中断后都要把什么压栈??? |
作者:wswh2o 栏目:单片机 |
我观察了生成的汇编代码,发现有时会把全局变量也压栈,为什么?? 谁清楚给讲讲呀! |
2楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 13:23:00 发布:
up |
3楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 13:53:00 发布:
晕,没人理? |
4楼: | >>参与讨论 |
作者: computer00 于 2005/11/11 14:06:00 发布:
全局变量也压栈了?能否把代码帖上来? 编译前后的都要。 |
5楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 15:59:00 发布:
123 12: void receive()interrupt 0 //parallel PORT receive 13: { 14: unsigned CHAR TEMP, i; C:0x0EB2 C0E0 PUSH ACC(0xE0) C:0x0EB4 C0F0 PUSH B(0xF0) C:0x0EB6 C083 PUSH command(0x83) C:0x0EB8 C082 PUSH nn(0x82) C:0x0EBA C0D0 PUSH PSW(0xD0) C:0x0EBC 75D000 MOV PSW(0xD0),#0x00 C:0x0EBF C000 PUSH 0x00 C:0x0EC1 C001 PUSH 0x01 C:0x0EC3 C002 PUSH 0x02 C:0x0EC5 C003 PUSH 0x03 C:0x0EC7 C004 PUSH 0x04 C:0x0EC9 C005 PUSH 0x05 C:0x0ECB C006 PUSH 0x06 C:0x0ECD C007 PUSH 0x07 15: unsigned int counter=0xffff; C:0x0ECF 754EFF MOV 0x4E,#0xFF C:0x0ED2 754FFF MOV 0x4F,#0xFF 16: EA=0; C:0x0ED5 C2AF CLR EA(0xA8.7) 17: IE0=0; C:0x0ED7 C289 CLR IE0(0x88.1) 18: rec(); //等数据 C:0x0ED9 121A06 LCALL rec(C:1A06) 19: TEMP=r_data; C:0x0EDC AF90 MOV R7,P1(0x90) 20: if(TEMP==0xf0) C:0x0EDE EF MOV A,R7 C:0x0EDF 64F0 XRL A,#B(0xF0) C:0x0EE1 7051 JNZ C:0F34 21: { 22: for(i=0; i<5; i++) C:0x0EE3 F54D MOV 0x4D,A 23: { 24: counter=0x0fff; C:0x0EE5 754E0F MOV 0x4E,#0x0F C:0x0EE8 754FFF MOV 0x4F,#0xFF 25: while( (~IE0) && (counter--) ); C:0x0EEB A289 MOV C,IE0(0x88.1) C:0x0EED B3 CPL C C:0x0EEE 500D JNC C:0EFD C:0x0EF0 E54F MOV A,0x4F C:0x0EF2 154F DEC 0x4F C:0x0EF4 AE4E MOV R6,0x4E C:0x0EF6 7002 JNZ C:0EFA C:0x0EF8 154E DEC 0x4E C:0x0EFA 4E ORL A,R6 C:0x0EFB 70EE JNZ C:0EEB 26: if(IE0) C:0x0EFD 308915 JNB IE0(0x88.1),C:0F15 27: { 28: IE0=0; C:0x0F00 C289 CLR IE0(0x88.1) 29: rec(); C:0x0F02 121A06 LCALL rec(C:1A06) 30: parallel_receive_data[i]=r_data; C:0x0F05 7467 MOV A,#parallel_receive_data(0x67) C:0x0F07 254D ADD A,0x4D C:0x0F09 F8 MOV R0,A C:0x0F0A A690 MOV @R0,P1(0x90) 31:&nbs |
6楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 16:01:00 发布:
变量如下定义,全局的 Uint8 idata set_num, ch_and_cloud=0x00, zoom, nn, baojing1=0; Uint8 idata parallel_receive_data[5], SYSTEM[7], baud_rate,time[6], command[3], shop_num[18]; |
7楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 16:03:00 发布:
仔细看了还有一个局部的变量也叫command[] ??不是因为这个吧? |
8楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 16:05:00 发布:
00大哥,你有qq或msn吗?? |
9楼: | >>参与讨论 |
作者: computer00 于 2005/11/11 16:38:00 发布:
那两个不是你的变量,而是刚好地址一样而已。 但物理地址是不一样的。 82H和83H是DPL和DPH,中断压的是数据指针DPL和DPH。 |
10楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 16:45:00 发布:
?? 地址一样,是指那个地址?? 我还是不太明白?? |
11楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/11 17:07:00 发布:
有点明白了,因为在中断中调用了一个函数 函数里用到了dptr,所以要报存他。 而dph和dpl在sfr里的地址是0x83和0x82. 谢谢啦! |
12楼: | >>参与讨论 |
作者: computer00 于 2005/11/11 17:13:00 发布:
command的地址跟DPH的地址一样啊 但command被分配在idata区,不能直接寻址区。 而DPH则是在直接寻址的高128字节中。 |
13楼: | >>参与讨论 |
作者: wswh2o 于 2005/11/12 8:34:00 发布:
知道拉! |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |