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 Reply Children
  • Just because it's a macro and I don't like macros when the implementation provides a clean way to do the same thing. Every thing I say is of course an opinion, take it with a grain of salt.

    Regards.

    - Mark

  • when should the word extern. when xdata should or should not be use. is xdata does the same as xbyte. pls, how can i increase DPTR when i want to write it in C? Also how can i just increase DPL? And how can i write the push and pop of assembly to. pls show me with some example. Is there any side where i can find out more about using c to to control 8051. Thank you.

  • 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.

  • 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