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