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

Combining C and assembly codes

Would appreciate if someone can tell/show me how to combine C and assembly code in the Uvision 2?

Parents
  • extern is only need on variables when you need to define them in one C file but use them in at least one other C file. The variables are extern'd in an include (.h) file typically which is included by all C files that require that variable.

    You can access DPTR via the sfr keyword extension. Read you C51 manual. I don't advise touching the DPTR however since you may clobber the compiler's use of it. Likewise you can access ports on the 8051 like this:

    sfr port0  = 0x80;
    sbit portBit0_0 = port0 ^ 0;
    sbit portBit0_1 = port0 ^ 1;
    ...
    sbit portBit0_7 = port0 ^ 7;
    
    port0      = 0xFF; // Set all pins high
    portBit0_1 = 0;    // Set Port 0.1 low
    
    xdata is not the same as XBYTE. To declare a variable that will exist in xdata simple do this:

    char xdata myVariable;
    Likewise you can place variables in data or idata (or pdata, bdata, etc) in a similar manner as in:

    char idata someVar;
    int data otherVar;

    To locate a variable at a particular address you use the _at_ directive like this:
    char xdata aVar _at_ 0x8000;
    int code bVar _at_ 0xFFFE;

    Read Kerrnigan & Ritchie's "The C Programming Language, 2nd Ed." and then read your C51 manual.

Reply
  • extern is only need on variables when you need to define them in one C file but use them in at least one other C file. The variables are extern'd in an include (.h) file typically which is included by all C files that require that variable.

    You can access DPTR via the sfr keyword extension. Read you C51 manual. I don't advise touching the DPTR however since you may clobber the compiler's use of it. Likewise you can access ports on the 8051 like this:

    sfr port0  = 0x80;
    sbit portBit0_0 = port0 ^ 0;
    sbit portBit0_1 = port0 ^ 1;
    ...
    sbit portBit0_7 = port0 ^ 7;
    
    port0      = 0xFF; // Set all pins high
    portBit0_1 = 0;    // Set Port 0.1 low
    
    xdata is not the same as XBYTE. To declare a variable that will exist in xdata simple do this:

    char xdata myVariable;
    Likewise you can place variables in data or idata (or pdata, bdata, etc) in a similar manner as in:

    char idata someVar;
    int data otherVar;

    To locate a variable at a particular address you use the _at_ directive like this:
    char xdata aVar _at_ 0x8000;
    int code bVar _at_ 0xFFFE;

    Read Kerrnigan & Ritchie's "The C Programming Language, 2nd Ed." and then read your C51 manual.

Children
  • Hi Mark/Andrew,

    Read through your advice to others. Splendid! Maybe either of you can assist me too.
    I came across this forum when I am seeking for some quick guide of sharing code of different files of C and .a51.

    Calling each other from C to get the function written in .a51 or vice-versa is completed. Went through c2asm2c.zip and it worked perfectly. However, I encounter some trouble when I need to pass on some variables that need to be manipulated from .a51 to .c
    My case:-

    Main code is in .a51. Requires to call a function that adds 20 slightly different 8bit data bytes and then take its average (i.e. by division).

    Writing the function above in .a51 is a pain due to unavailable 16bit-addition in 8051 done under Keil uV2.

    My solution thought:- is to write the addition function in C so addition can be done much more easily.

    Problem:- how do I pass the variables/registers defined in .a51 to the C function to be called from .a51 environment? The C function failed to recognize the similar declared register under .a51 before. Do I need to declare them under a new name OR use the similar name of data registers OR can use some global declaration of data registers. But how?

    Appreciate some really cool advice if available.

    Cheers,
    James