This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

accessing local "c" variables in inline assembly

How do I access a local variable in assembly?

I have used the SRC to determine how the compiler created the variable. it changes it's name from variable to variable?nnn where nnn is a number.

How do I determine what nnn is? (other than looking at the .src file)
can I access the variable using the original label name?

If I use the variable:nnn , nnn will occasionally change and ten I get errors!

Help

Parents
  • here is a Sample:

    void ProcessSerialSwitch()
    {
            data unsigned char i;
            data unsigned char RcvFIFOEmptyFlagLo;
            data unsigned char RcvFIFOEmptyFlagHi;
    //      char code Mask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    
    /*      MemSwitchReg();
            RcvFIFOEmptyFlagLo=XBYTE[RegAddrReceiveFIFOEmpty];
            RcvFIFOEmptyFlagHi=XBYTE[RegAddrReceiveFIFOEmpty+1];
            MemSwitchRam();
    */
    RcvFIFOEmptyFlagLo=0xFF;
    RcvFIFOEmptyFlagHi=0xFF;
    
            //对RcvFIFOEmptyFlagLo,RcvFIFOEmptyFlagHiæ¯ä¸€bit进行检测,若为1,则对åº"䏲壿œ‰æ•°æ®
            //ç"±äºŽCè¯­è¨€å¯¹ä½æ"作效率低,ä¸"此函数ç»å¸¸è¢«è°ƒç"¨ï¼Œæ"¹ä¸ºæ±‡ç¼–
            //for (i=0;i<SerialCount;i++) {
            //      if (i<8) {if (RcvFIFOEmptyFlagLo&Mask[i]) SerialSwitchReadChar(i);}
            //              else if (RcvFIFOEmptyFlagHi&Mask[i-8]) SerialSwitchReadChar(i);
            //}
    
    
            ACC=RcvFIFOEmptyFlagLo;
    
    #pragma asm
    
            checklo:
                    //MOV      A,RcvFIFOEmptyFlagLo
                    JZ      checkhi
    
    //              CLR      A
    #pragma endasm
                    i=0;
    #pragma asm
    
    //              MOV      i,A
    
            testlo:
    #pragma endasm
            ACC=RcvFIFOEmptyFlagLo;
    #pragma asm
    //              MOV      A,RcvFIFOEmptyFlagLo
                    JZ       checkhi
            lblrorlo:
                    CLR      C
                    RRC      A
                    JC               doreceivelo
                    JZ       checkhi
    //              INC              i
    #pragma endasm
                    i++;
    #pragma asm
                    JMP              lblrorlo
    
            doreceivelo:
            //      MOV              RcvFIFOEmptyFlagLo, A
    #pragma endasm
            RcvFIFOEmptyFlagLo=ACC;
            SerialSwitchReadChar(i);  //è¯»å–æ•°æ®
            i++;
            ACC=RcvFIFOEmptyFlagLo;
    #pragma asm
                    //inc      i
                    //MOV      A, RcvFIFOEmptyFlagLo
                    JNZ      lblrorlo
    
            checkhi:
    
    #pragma endasm
                    i=8;
                    ACC=RcvFIFOEmptyFlagHi;
    #pragma asm
    //              MOV      i,8
    //      testhi:
                    //MOV      A, RcvFIFOEmptyFlagHi
                    JZ       returnintr
    
            lblrorhi:
                    CLR      C
                    RRC      A
                    JC       doreceivehi
                    JZ       returnintr
    #pragma endasm
                    i++;
    #pragma asm
                    //INC      i
                    JMP      lblrorhi
            doreceivehi:
    //              MOV              RcvFIFOEmptyFlagHi, A
    #pragma endasm
            RcvFIFOEmptyFlagHi=ACC;
            SerialSwitchReadChar(i);
            i++;
            ACC=RcvFIFOEmptyFlagHi;
    #pragma asm
                    //inc      i
            //      MOV      A,RcvFIFOEmptyFlagHi
                    JNZ      lblrorhi
    
            returnintr:
                    RET
    
    
    #pragma endasm
    
    }
    
    

Reply
  • here is a Sample:

    void ProcessSerialSwitch()
    {
            data unsigned char i;
            data unsigned char RcvFIFOEmptyFlagLo;
            data unsigned char RcvFIFOEmptyFlagHi;
    //      char code Mask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    
    /*      MemSwitchReg();
            RcvFIFOEmptyFlagLo=XBYTE[RegAddrReceiveFIFOEmpty];
            RcvFIFOEmptyFlagHi=XBYTE[RegAddrReceiveFIFOEmpty+1];
            MemSwitchRam();
    */
    RcvFIFOEmptyFlagLo=0xFF;
    RcvFIFOEmptyFlagHi=0xFF;
    
            //对RcvFIFOEmptyFlagLo,RcvFIFOEmptyFlagHiæ¯ä¸€bit进行检测,若为1,则对åº"䏲壿œ‰æ•°æ®
            //ç"±äºŽCè¯­è¨€å¯¹ä½æ"作效率低,ä¸"此函数ç»å¸¸è¢«è°ƒç"¨ï¼Œæ"¹ä¸ºæ±‡ç¼–
            //for (i=0;i<SerialCount;i++) {
            //      if (i<8) {if (RcvFIFOEmptyFlagLo&Mask[i]) SerialSwitchReadChar(i);}
            //              else if (RcvFIFOEmptyFlagHi&Mask[i-8]) SerialSwitchReadChar(i);
            //}
    
    
            ACC=RcvFIFOEmptyFlagLo;
    
    #pragma asm
    
            checklo:
                    //MOV      A,RcvFIFOEmptyFlagLo
                    JZ      checkhi
    
    //              CLR      A
    #pragma endasm
                    i=0;
    #pragma asm
    
    //              MOV      i,A
    
            testlo:
    #pragma endasm
            ACC=RcvFIFOEmptyFlagLo;
    #pragma asm
    //              MOV      A,RcvFIFOEmptyFlagLo
                    JZ       checkhi
            lblrorlo:
                    CLR      C
                    RRC      A
                    JC               doreceivelo
                    JZ       checkhi
    //              INC              i
    #pragma endasm
                    i++;
    #pragma asm
                    JMP              lblrorlo
    
            doreceivelo:
            //      MOV              RcvFIFOEmptyFlagLo, A
    #pragma endasm
            RcvFIFOEmptyFlagLo=ACC;
            SerialSwitchReadChar(i);  //è¯»å–æ•°æ®
            i++;
            ACC=RcvFIFOEmptyFlagLo;
    #pragma asm
                    //inc      i
                    //MOV      A, RcvFIFOEmptyFlagLo
                    JNZ      lblrorlo
    
            checkhi:
    
    #pragma endasm
                    i=8;
                    ACC=RcvFIFOEmptyFlagHi;
    #pragma asm
    //              MOV      i,8
    //      testhi:
                    //MOV      A, RcvFIFOEmptyFlagHi
                    JZ       returnintr
    
            lblrorhi:
                    CLR      C
                    RRC      A
                    JC       doreceivehi
                    JZ       returnintr
    #pragma endasm
                    i++;
    #pragma asm
                    //INC      i
                    JMP      lblrorhi
            doreceivehi:
    //              MOV              RcvFIFOEmptyFlagHi, A
    #pragma endasm
            RcvFIFOEmptyFlagHi=ACC;
            SerialSwitchReadChar(i);
            i++;
            ACC=RcvFIFOEmptyFlagHi;
    #pragma asm
                    //inc      i
            //      MOV      A,RcvFIFOEmptyFlagHi
                    JNZ      lblrorhi
    
            returnintr:
                    RET
    
    
    #pragma endasm
    
    }
    
    

Children