Had some further exchanges in private with Don, but here is the bottom line as far as I am understanding things...

The relocation of a value have nothing to do with the instruction, or the addressing mode of the instruction. If that is being used, it is "wrong". The addressing mode, if the expression is relocatable, will decide what kind of relocatable record will be created, but it does not decide if there even should be a relocatable record or not.

This should all be about the value of the evaluated expression. If the evaluated expression is relative, then it needs to be relocated by the linker. If it is absolute, then MACRO-11 can create the end results directly.

A few examples:

.MAIN.  MACRO V05.05  Saturday 7-MAR-20 15:42  Page 1


      1 000000                                  .PSECT  FOO,I,RW
      2
      3 000000  000042                          .WORD   42
      4 000002  000000                  Y:      .WORD   0
      5
      6 000004  005067  177772                  CLR     Y
      7 000010  005037  000002'                 CLR     @#Y
      8 000014  005067  001234'                 CLR     X
      9 000020  005037  001234                  CLR     @#X
     10
     11 000000                                  .ASECT
     12         001000                          .=1000
     13         001234                  X=1234
     14
     15 001000  005067  000230                  CLR     X
     16 001004  005037  001234                  CLR     @#X
     17 001010  005067  000002'                 CLR     Y
     18 001014  005037  000002'                 CLR     @#Y
     19
     20         000001                          .END




.MAIN.  MACRO V05.05  Saturday 7-MAR-20 15:42  Page 1-1
Symbol table

X     = 001234          Y       000002R     002

. ABS.  001020    000   (RW,I,GBL,ABS,OVR)
        000000    001   (RW,I,LCL,REL,CON)
FOO     000024    002   (RW,I,LCL,REL,CON)
Errors detected:  0

*** Assembler statistics


Work  file  reads: 0
Work  file writes: 0
Size of work file: 40 Words  ( 1 Pages)
Size of core pool: 9524 Words  ( 36 Pages)
Operating  system: RSX-11M/M-PLUS

Elapsed time: 00:00:00.01
,TT=TT


Line 6 becomes an absolute expression since it's a subtraction of the relative address of Y from the current position, both in the same psect. Such an operation renders an absolute value.

Line 7 becomes relocatable, since the absolute address of Y is unknown because it's in a psect that can be moved around at link time.

Line 8 becomes relocatable because even though X is at a known address, the address of the instruction is unknown and subject to the location of the psect, which is only decided at link time.

Line 9 becomes absolute since it is an expression only dependent on an absolute value.

Line 15 becomes absolute since it's an expression subtracting two absolute values which obviously have an absolute result.

Line 16 becomes absolute since it is an expression only dependent on an absolute value.

Line 17 becomes relocatable because the address of Y is in another psect, and the subtraction of a relative address from an absolute renders a relative value.

Line 18 becomes relocatable because the absolute address of Y is unknown. MACRO-11 only have a relative value of Y.

Note that all references to Y contains 000002. This is because that is the offset of Y within the psect. This is added to the base of the psect (the part that comes from this object file), which is all the linker will know about.

  Johnny

On 2020-03-07 14:47, Rhialto wrote:
On Sat 07 Mar 2020 at 01:59:03 +0100, Johnny Billquist wrote:
In the end, that is a different thing. Absolute addressing is not what Bob
was thinking about here...

Here is what MACRO-11 does:

       1 000000                                  .ASECT
       2         001000                          .=1000
       3         001234                  X=1234
       4
       5 001000  005067  000230                  CLR     X
       6

Note that the addressing is still relative. But the actual offset required
can be computed by MACRO-11 at compile time.

This is the output of dumpobj for that code. It looks like indeed there
is an unneeded relocation record in there:

GSD:
         GLOBAL X     =1234 DEF ABS flags=110
         MODNAME TEST  =0 flags=0
         PSECT       =0  CON RW REL LCL I flags=40
         PSECT . ABS.=1004  OVR RW ABS GBL I flags=104
         XFER . ABS.=1 flags=10
ENDGSD
RLD
         Location counter definition . ABS.+1000
TEXT ADDR=1000 LEN=4
         001000: 005067 001234               7...
RLD
         Internal displaced 1002=1234
ENDMOD

It looks like the 2nd RLD record is generated by the code
text_displaced_word() in object.c. That in turn must be called from this
code in assemble_aux.c, since there are no other callers to
store_displaced_word():

void mode_extension(
...
     if (value->type == EX_LIT) {
         if (mode->rel)                 /* PC-relative? */
             store_displaced_word(str, tr, 2, value->data.lit);
         else
             store_word(str, tr, 2, value->data.lit);    /* Just a
                                                            known
                                                            value. */

My guess is that this could become something like

     if (value->type == EX_LIT) {
         if (mode->rel) {              /* PC-relative? */
            if (current_pc->section->flags & PSECT_REL) {
                store_displaced_word(str, tr, 2, value->data.lit);
            } else {
                /* I can compute this myself. */
                store_word(str, tr, 2, value->data.lit - DOT - 2);
            }
        } else {
             store_word(str, tr, 2, value->data.lit);    /* Just a
                                                            known
                                                            value. */
        }

It seems like this case didn't come up in any previous tests; the
regression tests show no change at all. (I have tested somewhat strictly
by hand that various RSX-Kermit-11 source files generated the same
object files as on RSX and that the listings, including macro expansion,
didn't have any unexplained differences).

Any interesting test cases I can use with this, so see if it is correct
this way?

        1                                        .TITLE  TEST RELOCATABLE 
REFERENCES
        2 000000                                 .ASECT
        3        001000                          .=1000
        4        001234                  X == 1234
        5 001000 005067  000230                  CLR     X

.     =******           X     =001234 G
. ABS.  001004    000   (RW,I,GBL,ABS,OVR,NOSAV)


   Johnny
-Olaf.


--
Johnny Billquist                  || "I'm on a bus
                                  ||  on a psychedelic trip
email: b...@softjar.se             ||  Reading murder books
pdp is alive!                     ||  tryin' to stay hip" - B. Idol
_______________________________________________
Simh mailing list
Simh@trailing-edge.com
http://mailman.trailing-edge.com/mailman/listinfo/simh

Reply via email to