I wouldn't say I "must", but I will say I "might".
:-)

btw, did you know your posts and showing up twice?  For me, anyway.

Frank




>________________________________
> From: "McKown, John" <john.mck...@healthmarkets.com>
>To: ASSEMBLER-LIST@LISTSERV.UGA.EDU 
>Sent: Tuesday, June 12, 2012 3:39 PM
>Subject: Re: CEETERM and register 15
> 
>You can continue to use R15, if you really must. And it should work if you do 
>put the return code and modifer (both!) in the DSA area.
>
>John McKown
>
>Systems Engineer IV
>
>IT
>
>
>
>Administrative Services Group
>
>
>
>HealthMarkets®
>
>
>
>9151 Boulevard 26 . N. Richland Hills . TX 76010
>
>(817) 255-3225 phone .
>
>john.mck...@healthmarkets.com . www.HealthMarkets.com
>
>
>
>Confidentiality Notice: This e-mail message may contain confidential or 
>proprietary information. If you are not the intended recipient, please contact 
>the sender by reply e-mail and destroy all copies of the original message. 
>HealthMarkets® is the brand name for products underwritten and issued by the 
>insurance subsidiaries of HealthMarkets, Inc. -The Chesapeake Life Insurance 
>Company®, Mid-West National Life Insurance Company of TennesseeSM and The MEGA 
>Life and Health Insurance Company.SM
>
>
>
>> -----Original Message-----
>> From: IBM Mainframe Assembler List
>> [mailto:ASSEMBLER-LIST@LISTSERV.UGA.EDU] On Behalf Of Frank Swarbrick
>> Sent: Tuesday, June 12, 2012 4:20 PM
>> To: ASSEMBLER-LIST@LISTSERV.UGA.EDU
>> Subject: Re: CEETERM and register 15
>>
>> So it sounds like the original author should have never used
>> R15 in the first place for the base register.  OK.
>>
>> The program doesn't use any macros other than the CEE ones I
>> just added and ABEND.  But I'll see if I can find a free
>> register other than 14 (or 15 or 0 or 1!).  It's pretty much
>> used every other register at some point in the program, but
>> hopefully I can get around that.
>>
>> I've been reading about "baseless" programming and all new
>> code I've added uses it, but at this point it don't want to
>> make too many changes to it.  So is your suggestion to use
>> RC=RETCODE,MODIFIER=MOD and have those two as part of my
>> automatic storage area?  Actually, if I do that I can
>> probably get away (for now) with leaving it using R15, since
>> those fields will be based on R13.
>>
>> I will try this out.  Thanks for your help!!!!
>> Frank
>>
>>
>>
>>
>> >________________________________
>> > From: "McKown, John" <john.mck...@healthmarkets.com>
>> >To: ASSEMBLER-LIST@LISTSERV.UGA.EDU
>> >Sent: Tuesday, June 12, 2012 2:53 PM
>> >Subject: Re: CEETERM and register 15
>> >
>> >The reason for the L in CEETERM is because you can do
>> CEETERM RC=VARNAME,MODIFIER=MODNAME where VARNAME and MODNAME
>> are fullword areas.
>> >
>> >In general, in z/OS, you should __never__ use R0 (impossible
>> actually), R1, R14, or R15 for a CSECT/RSECT base register.
>> Many (most) IBM macros use these registers. And occassionally
>> other registers as well.
>> >
>> >For LE enabled assembler (I have written some), when I use a
>> base register at all (not often any more), I use R11 for my
>> first, then R10, R9, and so as as the module grows in size.
>> In "modern" programming, you can avoid the use of a "base
>> register" for code in almost every case by using relative
>> instructions instead of based instructions. E.g. use LARL
>> instead of LA for areas in the CSECT, and Jxx instead of Bxx
>> for branching. If you load constant values, try to use LHI if
>> possible. Do try to write reentrant code. If you do that, you
>> can keep the modifiable values in the DSA, which is addressed
>> by R13 and which is set up for you with the CEEENTRY and
>> CEEDSA macros. For a constant which does not fit into a
>> halfword, or maybe is packed decimal or characters, you can
>> replace somethin like: L R7,FULLWORD with 2 instructions:
>> LARL R7,FULLWORD followed by L R7,0(,R7), and the same with
>> packed and characters. OK, that is a bit ugly, I admit.
>> >
>> >
>> >--
>> >John McKown
>> >Systems Engineer IV
>> >IT
>> >
>> >Administrative Services Group
>> >
>> >HealthMarkets®
>> >
>> >9151 Boulevard 26 . N. Richland Hills . TX 76010
>> >(817) 255-3225 phone .
>> >john.mck...@healthmarkets.com . www.HealthMarkets.com
>> >
>> >Confidentiality Notice: This e-mail message may contain
>> confidential or proprietary information. If you are not the
>> intended recipient, please contact the sender by reply e-mail
>> and destroy all copies of the original message.
>> HealthMarkets® is the brand name for products underwritten
>> and issued by the insurance subsidiaries of HealthMarkets,
>> Inc. -The Chesapeake Life Insurance Company®, Mid-West
>> National Life Insurance Company of TennesseeSM and The MEGA
>> Life and Health Insurance Company.SM
>> >
>> >> -----Original Message-----
>> >> From: IBM Mainframe Assembler List
>> >> [mailto:ASSEMBLER-LIST@LISTSERV.UGA.EDU] On Behalf Of
>> Frank Swarbrick
>> >> Sent: Tuesday, June 12, 2012 3:25 PM
>> >> To: ASSEMBLER-LIST@LISTSERV.UGA.EDU
>> >> Subject: CEETERM and register 15
>> >>
>> >> First off please realize that I'm an assembler beginner.
>> >> I've fiddled with it here and there for 15 years, but I'm
>> >> really just a COBOL programmer.  So please be gentle!  :-)
>> >>
>> >> We have a vendor written, code supplied, subroutine that does
>> >> for us a few things that COBOL can't (bit fiddling; posting
>> >> of an ECB; etc.).  This same exact routine is called both by
>> >> batch COBOL program and CICS COBOL programs.  It is not
>> >> reentrant.  In order to make it reentrant I have been working
>> >> on "LE-enabling" it.  This seems to work quite well!  But I
>> >> ran in to something "weird" with CEETERM.  CEETERM RC=0
>> >> generates the following:
>> >>
>> >> 58F0 F098            013A0  1827+         L   15,=A(0)
>> >>
>> >> 5800 F098            013A0  1828+         L   0,=A(0)
>> >> 58DD 0004            00004  1829+         L   13,4(13)
>> >> 58E0 D00C            0000C  1830+         L   14,12(,13)
>> >> 981C D018            00018  1831+         LM  1,12,24(13)
>> >> 07FE                        1832+         BR  14
>> >>
>> >> Problem?  The program uses register 15 as the base register.
>> >> Funny thing is that the code actually "works".  But it really
>> >> doesn't. The first L sets R15 to 0.  Then the second L loads
>> >> in to R0 from 152(,R15), but of course R15 is now 0, not the
>> >> real base address it needs to be.  It's only coincidence that
>> >> 152 bytes in to low core contains x'00000000'.  If I tried to
>> >> use an RC of some other value it would still be set to 0.
>> >>
>> >>
>> >> I changed the program to use 14 instead of 15 for the base
>> >> register and all is now fine.  But I don't see it documented
>> >> that CEETERM should not be used when the base is R15.  Or is
>> >> it just common practice to not use R15 as the base?  Other
>> >> than this one program I don't see that R15 is generally used
>> >> for that purpose even though it starts out with the correct
>> >> address, which is probably why it was used in this case.
>> >> Specifically, the original code was this:
>> >> SUBR     CSECT
>> >>
>> >>          USING *,RF
>> >>          B     START
>> >>          DC    CL8'SUBR'
>> >> START    DS    0H
>> >>          SAVE  (14,12)
>> >>
>> >> Anyway, I have to wonder why CEETERM doesn't take a page from
>> >> the RETURN macro, and use LA from an offset into "R0", i.e.,
>> >> if I had CEETERM RC=12,MODIFIER=8, we'd get something like this:
>> >>
>> >> LA  15,12(0)
>> >> LA  0,8(0)
>> >> L   13,4(13)
>> >> L   14,12(,13)
>> >> LM  1,12,24(13)
>> >> BR  14
>> >>
>> >> No base register needed, correct?  (This is one of those
>> >> cases where "register 0" is really just "zero", right, no
>> >> matter what value it actually holds?)
>> >>
>> >>
>> >> (Apologies to Russ Evans, if he is reading this, for taking
>> >> an unexpected side trip to LE land.)
>> >>
>> >> Hope I've not shown too much ignorance.
>> >>
>> >>
>> >> Thanks!
>> >> Frank
>> >>
>> >>
>> >>
>> >
>> >
>> >
>>
>>
>
>
>

Reply via email to