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

Parameter Passing in Registers

Hi

I am unclear as to how I can pass 2 generic pointer arguments into a function.

As stated in the user guide, the generic ptr will be stored in R1-R3. But however, what happens when there is more than 1 argument?

Please advice. Any explaination is appreciated. Thank you in advance.

Regards
Wtwh

Parents
  • I'm not sure from your response if you tried "?function?byte" literally. You need to substitute the name of the actual function for function. (Each function could potentially have its own parameter area; when the functions are not declared reentrant, the linker will overlay these areas according to the call tree.)

    Check carefully the size and number of your parameters so that you can figure out the right offset in the ?_MyFunction?byte area to find your parameter.

    Note that you can pass up to three two-byte pointers in registers. If you're willing to restrict the function to work only on xdata (for example), you might be able to avoid parameters spilling into memory.

Reply
  • I'm not sure from your response if you tried "?function?byte" literally. You need to substitute the name of the actual function for function. (Each function could potentially have its own parameter area; when the functions are not declared reentrant, the linker will overlay these areas according to the call tree.)

    Check carefully the size and number of your parameters so that you can figure out the right offset in the ?_MyFunction?byte area to find your parameter.

    Note that you can pass up to three two-byte pointers in registers. If you're willing to restrict the function to work only on xdata (for example), you might be able to avoid parameters spilling into memory.

Children
  • Thank you for the reply. Yes. I did substitute the name of the function.

    1) The first parameter passed in is actually an address &array[10] while the variable array is declared in xdata. However, the values are still found in R1-R3 instead of R6-R7. How can I make it a 2-byte pointer?

    2)The second parameter is a function pointer. In this case how can work on xdata with this parameter? The actual value passed in is the name of the function.

    Thank you for your advice. Although seemingly straight-forward, I'm having problems access the values passed in from the allocated memory location.

  • How can I make it a 2-byte pointer?

    I do not know, try typecastion it a short.
    Unfortunately Keil has given in to the PC types that believe that the '51 is just another processor. Anyone coding for the '51 that want to be unaware of which codespace a variable is located in should go back to his/her beloved PC.

    Erik

  • How can I make it a 2-byte pointer

    Your type declarations must include one of the memory type qualifers, e.g.

    void MyFunction (U8 xdata* p1, U8 xdata* p2)

    instead of

    void MyFunction (U8* p1, U8* p2)

    The first has a two-byte pointers passed in R6/R7 and R4/R5, the second is a three-byte generic pointer passed in R1-R3 and some memory space. The advantage of the second format is that one routine will work on data in any location (data or xdata). The first produces smaller and faster code.