From: "Paul Gilmartin" <[email protected]>
Sent: Friday, 10 September 2010 11:53 PM

On Sep 10, 2010, at 00:53, robin wrote:

From: "Paul Gilmartin" <[email protected]>
Sent: Thursday, 9 September 2010 4:32 PM

I would firmly oppose such a gentle correction.  Take a broad view.
Which has the more obvious meaning:

        LA    R3,-4(R2)       Set R3 to 4 less than R2

It doesn't.
It sums 4092 and the content of R2.
If the content of R2 is positive, the sum is larger than the original content
of R2 by 4092.*
If the content of R2 is negative, its value is increased by 4096.
However, if the intermediate sum were negative, the value being
deposited in R3 [being truncated to 24 bits) would become a large positive 
value.
In all cases, R3 becomes larger than R2.
[I'm assuming that you meant to write LA R3,-4(0,R2) ]

I did not.  As I expanded a few hours later, in a SYSPRINT excerpt:

                R:1 FFF000           2          USING -4096,R1
000000 4132 1FFC           FFFFFC     3          LA    R3,-4(R2)

The assembler observes there is a USING that allows resolution
of the coded address, -4, and generates an instruction which
adds:

    4092  The resolved displacement
   -4096  From R1, the resolved base
    (R2)  Specified in the instruction

Setting R3 to 4 less than R2 (modulo address range, as the
hardware always operates).

[* The resultant sum must not exceed 24 bits, of course in classic
base-displacement addressing.]

or 31 in neoclassic.

I know that too.

 The value is stored modulo that address
range; the condition code is not set; no exception is taken.
If the initial content of R2 is less than 4, R3 may be set to
a large positive number.  If the initial content of R2 is
outside address range, R3 may be set to far less than (R2)-4,
always correctly modulo address range.  This is the way the
address generation hardware has operated from s/360 onward.

I know how the address generation haardware on S/360 and later machines operate,
as I have written simulators for that instruction set,
as well as a compiler for that hardware ...

or:

        LA    R3,4092(R1,R2)  Set R3 to 4 less than R2

It doesn't either [viz, set R3 to 4 less than R2].
It sums the contents of Reg 1 and Reg 2 and the displacement value 4092.

You deleted the context.  R1 was loaded with -4096.

On the contrary, you *introduced* those two assembly instructions into your 
email.
There were no other assembly-language instructions in it.

There was nothing in your email that said R1
contained anything in particular.
Nor was there anything in your email that was written or implied
that said R1 was used in the first instruction.
It was, in point of fact, you yourself introduced the context.

?  The first hardly needs the comment to show the programmer's
intention,

What the first comment does is to show the reader that the programmer
made a programming error.

The assembler discreetly refrains from making guesses concerning
the programmer's intention.

It's the same for the second LA, where the programmer has made two
erroneous assertions.

If you're referring to "LA R3,-4(,R2)" or "LA R3,-4(0,R2)", agreed.
I made a coding error which the assembler should have reported but
failed to.

-- gil

Reply via email to