登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

c51在进入中断后都要把什么压栈???

作者:wswh2o 栏目:单片机
c51在进入中断后都要把什么压栈???
我观察了生成的汇编代码,发现有时会把全局变量也压栈,为什么??
谁清楚给讲讲呀!

2楼: >>参与讨论
wswh2o
up
 
3楼: >>参与讨论
wswh2o
晕,没人理?
 
4楼: >>参与讨论
computer00
全局变量也压栈了?能否把代码帖上来?
编译前后的都要。

5楼: >>参与讨论
wswh2o
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
变量如下定义,全局的
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
仔细看了还有一个局部的变量也叫command[]
??不是因为这个吧?

8楼: >>参与讨论
wswh2o
00大哥,你有qq或msn吗??
 
9楼: >>参与讨论
computer00
那两个不是你的变量,而是刚好地址一样而已。
但物理地址是不一样的。

82H和83H是DPL和DPH,中断压的是数据指针DPL和DPH。

10楼: >>参与讨论
wswh2o
??
地址一样,是指那个地址??
我还是不太明白??

11楼: >>参与讨论
wswh2o
有点明白了,因为在中断中调用了一个函数
函数里用到了dptr,所以要报存他。
而dph和dpl在sfr里的地址是0x83和0x82.
谢谢啦!


12楼: >>参与讨论
computer00
command的地址跟DPH的地址一样啊
但command被分配在idata区,不能直接寻址区。

而DPH则是在直接寻址的高128字节中。

13楼: >>参与讨论
wswh2o
知道拉!
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
大家谈谈对凌阳单片机的看法!
ADUC812BS有人在用吗?
请教PCB布线的一个技巧
有430高手吗?
大虾门,来看看吧
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号