Tom,

close, but no cigar. Addres arithmetic wraps.
And if you wrap nearly all the way around, you
effectively end up with an address slightly
lower than the starting point.
To my mind, this is *effectively* subtraction,
even when *technicall* the processor
performed addition.

If you walk forward around the globe and
stop 10 meters short of your starting point,
the net result is the same as going back 10
meters. I'm sorry - it's as ugly (or beautiful)
as it is.

Cheers,
Abe Kornelis.
=========


----- Original Message -----
From: "Tom Marchant" <[email protected]>
To: <[email protected]>
Sent: Wednesday, September 08, 2010 9:09 PM
Subject: Re: Instruction Set Architecture


On Wed, 8 Sep 2010 08:35:42 -0600, Paul Gilmartin wrote:

On Sep 8, 2010, at 05:39, robin wrote:

Classic base-displacement atithmetic is always addition,
never subtraction.

Ahem.

        LH    R1,=H'-4096'
        USING -4096,R1
        LA    R2,*
        LA    R3,-4(,R2)

What does R3 now address?

I'm surprised that this would assemble.

              R:F  00000          20          USING TEST5,R15
                                  21 *
0000 4810 F010            00010    22          LH    R1,=H'-4096'
              R:1 FFF000          23          USING -4096,R1
0004 4120 F004            00004    24          LA    R2,*
0008 4130 2FFC           FFFFFC    25          LA    R3,-4(,R2)
                                  26 *
0010                               27          LTORG
0010 F000                          28                =H'-4096'

I don't understand why the instruction at line 25 assembles
as 4130 2FFC.  As far as I can see, it should generate an error.

Still, Robin is correct.  The base-displacement arithmetic is
addition only.  The displacement is an unsigned value from 0 to
4095.  So, if the program is loaded into location 1000 and executed,
statement 24 would set register 2 to x'1004' and statement 25 would
set register 3 to x'2000'.  That is, 1004+FFC.

--
Tom Marchant


Reply via email to