Being able to fix bugs like this is one of the reasons we like open source so much.

I took a look at a copy of the gas source I have online. Thankfully, the pdp-11 assembly parser is not embedded within nor totally intertwined with the monstrosity (my opinion; obviously others don't see it that way) known as "bfd".

If I'm not mistaken, the bug is within binutils/gas/config/pdp11.c . The routine parse_op_noreg () in that file contains:

  if (*str == '@' || *str == '*')
    {
      str = parse_op_no_deferred (str + 1, operand);
      if (operand->error)
        return str;
      operand->code |= 010;
    }

and the routineparse_op_no_deferred() is little more than a large, complex switch on the next (non-whitespace) char, the first case of which assumes that if the char is '(', then the mode must be either (rn) or(rn)+.

It seems that operand->code is being set "wrong", as (at least for MACRO-11 compatibility) the code above should have the call to parse_op_no_deferred() set that field to (registerno | (6 << 3)) for a mode 7 operand, after which the "|= 010" would change it to mode 7. But within parse_op_no_deferred()*,***as the '@' before "(ER)" was already eaten before the routine was called, you get mode 1, not mode 6 (again without being able to consider the '@' within this routine).

Perhaps a fix could involve setting the 010 (octal) bit before (rather than after) the call to parse_op_no_deferred(), and when it gets in there, it could use that as a flag saying that finding a '(' will lead to the mode 6 code path (not the mode 1 code path), resulting in mode 7 (because of the '@')), & the setting of operand->word to 0.

- michael

P.S. Apologies if I've totally missed the boat. it's late and i'm ghetting punchy....



On 08/21/2012 05:48 PM, Larry Baker wrote:
On 17 Aug 2012, at 9:00 AM, [email protected] <mailto:[email protected]> wrote:

Well, using the DEC notation for PDP-11 assembler language, @(R0) and
(R0) are indeed two different things, and you seem to have understood it
perfectly right.
Not sure if gas might have its own ideas about notation though...

See the NOTE at the bottom of page 5-5 in Section 5.8, INDEX DEFERRED MODE, in the PDP-11 MACRO-11 Language Reference Manual on the BitSavers web site (http://www.bitsavers.org/pdf/dec/pdp11/rsx11/RSX11M_V4.1_Apr83/4_ProgramDevelopment/AA-V027A-TC_macro11_Mar83.pdf):

   The expression @(ER) may be used, but it
   will be assembled as if it were written
   @0(ER), and a word will be used to store
   the 0.

GAS has got it wrong. There really is no addressing mode of the form @(ER). GAS should either follow MACRO-11 and convert @(ER) to @0(ER), or it should give an error. It should not convert @(ER) to @ER, which is equivalent to (ER). That is, it should not be silently eliminating the @ deferred address operator from the operand.

Larry Baker
US Geological Survey
650-329-5608
[email protected] <mailto:[email protected]>



_______________________________________________
Simh mailing list
[email protected]
http://mailman.trailing-edge.com/mailman/listinfo/simh

Reply via email to