As someone who has written a fair number of C++-callable z/OS assembler 
routines I can assure you that even though it is call-by-value, the callee's 
entry R1 points to a list of addresses. Here is working code in assembler that 
picks up an integer (R10 is the entry R1 and PARM2 EQU 4).

         L     R2,PARM2(,R10)       Address of Length in R2
         L     R0,0(,R2)            Length in R0

Here's the declaration of the function in C++

extern "OS" { void FREEMAIN(void *address, const unsigned int size); }

(Which, BTW, I guess answers my out-loud musing. Even though it is conceptually 
call-by-value, the address of (a copy of, presumably) the packed field is 
passed to printf().

In the assembler routine, call by value and call by reference (& notation) look 
the same. The only visible difference I know of is whether the list off of R1 
points to the variable or a copy of the variable. 

Charles


-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On Behalf 
Of Bernd Oppolzer
Sent: Wednesday, April 26, 2017 3:20 PM
To: IBM-MAIN@LISTSERV.UA.EDU
Subject: Re: Can XLC printf() take "%D(*,*)"?

Well, from a technical point of view,

languages like PL/1 (and Fortran, for example), which in their classical form 
only supported call by reference, put only addresses in the reg 1 addressed 
so-called parameter (address) list. (reg 1 points at the start of a list of 
parameter addresses, so that the called routine can access the arguments 
specified by the caller on the call statement and maybe change them).

Some additional remarks regarding PL/1: PL/1 often does not point to the 
arguments directly from the address in the reg 1 address list, but instead to 
descriptor structures, which hold type information about the parameter and a 
secondary pointer to the argument, so things are real complicated with PL/1.
And: modern PL/1 supports BYVALUE, too; not only BYREFERENCE.
And NODESCRIPTOR, BTW.

With call by value (which is the only possible parameter mechanism in C), not 
addresses but values are put into the reg 1 parameter list, which is not an 
address list any more, but a list of values (which can be pointers, of course). 
But the values can also be double floats, decimals and even structures, which 
all can be greater than 4 bytes. So the old rule that the length of the 
parameter list determines the number of parameters (parameter count multiplied 
by 4) holds no longer.

The problem that by value parameters are larger than 4 bytes (larger than
addresses) is not new with decimal values; it is already a problem with double 
float value parameters (it was present from the beginning of C by value 
parameter passing).

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to