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
  • Thank you for your responses.

    I have a follow up question regarding parameter passing in fixed memory locations.

    As mentioned, I understand that the second generic pointer is passed using segment name function?byte. However, I still do not know how I can access the values passed in. I tried :

    mov DPTR,#?_FUNCTION?BYTE+0

    but it doesn't work. Could you kindly advise? Any reference to sample code would be most useful.

    Thank you.

Reply
  • Thank you for your responses.

    I have a follow up question regarding parameter passing in fixed memory locations.

    As mentioned, I understand that the second generic pointer is passed using segment name function?byte. However, I still do not know how I can access the values passed in. I tried :

    mov DPTR,#?_FUNCTION?BYTE+0

    but it doesn't work. Could you kindly advise? Any reference to sample code would be most useful.

    Thank you.

Children
  • There can - as far as I can see - be no reason for your question other than calling an assembler routine from C.

    The easy way to code that is to make a skeleton routine in C and use the very well documented assembly code generated as a template.

    Erik

  • The easy way to code that is to make a skeleton routine in C and use the very well documented assembly code generated as a template.

    Like you said,I have tried what you suggested. Unfortunately, I still have difficulty making sense of the assembly output.

    For example, to access a parameter it uses

    MOV DPTR,#ptos

    which I tried but generated an error in my assembly function.

    Kindly advice. Thank you very much.

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

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