;;;;; ; ; Test expressions that evaluate to registers. ; ; All lines not marked "error" should assemble without complaint ; as absolute values (no relocation etc). ; ; Section 3.4 (page 3-8) is a bit vague about the expressions that are allowed ; after a %, but "the digit specifying the register can be replaced by any valid, ; absolute term that can be evaluated during the first assembly pass." ; It specifically mentions %3+1 to be the same as %4. ; For the rest there is no indication where exactly register labels can be used. .psect abs,abs A = 1 l1 = %1 l2 = %1+1 l3 = %a l4 = %a + 1 l5 = %<1+1> l6 = <%1>+1 ; must be register! l7 = <%a>+1 ; must be register! l8 = %1 + %2 l8a = <%1> + <%2> ; must be register! l9 = %<%1 + %2> l9c = %<%<%1 + %2>> l9d = %<%<%<%1 + %2>>> l9a = % l9b = % B = rti ; 2 l10 = %B l11 = %wait ; 1 l12 = %1. l13 = %7. l14 = %10 ; error: too large (error R), but symbol is still def'd l15 = %8. ; error: too large (error R), but symbol is still def'd mov #R2,R2 mov #%2,%2 ; 012702 000002 must be absolute, not reloc! mov #l1,%2 ; 012702 000001 (idem) mov #<%1+%2>,%3 ; 012703 000003 (idem) mov #,%3 ; 012703 000002 (idem) mov #<%l1+1>,%3 ; 012703 000002 (idem) mov #r0,%2 ; 012702 000000 (idem) here: mov #here,%2 mov #rti,%2 mov %2,%2 ; 010202 mov l1,%2 ; 010102 mov <%1+%2>,%3 ; 010303 mov ,%3 ; 010203 mov R1+1,%3 ; 010203 mov <%l1+1>,%3 ; 010203 mov %1,r2 ; mov r1,r2 mov %0+1,r2 ; mov r1,r2 mov %<0+1>,r2 ; mov r1,r2 mov r0,r2 ; mov r0,r2 mov ----r1, ; mov r1,r2 mov r0+1,r2 ; mov r1,r2 mov r1+7,r2 ; error: too large ; R 58 000066 016702 000010' mov r1+7,r2 ; too large ; this shows that after a % comes a unary expr, ; not an arbitrary binary expr: l30 = 1+%2*2 ; %6. l31 = <1+%2>*3 ; %9. error: too large, but symbol is still defined (R error) mov l31,r0 ; error: bad register; code 011100 (R error) l32 = 1+%<2*2> ; %5 l33 = 1+<%2*2> ; %5 l20 = %l1 l21 = %l20 l22 = l1 ; still a register l23 = l22 ; still a register .globl extrn l40 = %extrn ; A error; L40 =%****** mov l40,r0 ; U error; code 010000 .word r0,wait,r1+1,wait+2,%4 ; 0, 1, 2, 3, 4 .end