Referencing the location counter value

The value of the location counter is referenced by using the asterisk (*)

When used in an instruction, the value of the asterisk resolves to the address of the instruction.

Loc Cntr Value           Assembler Code

000100                            B     PASTLOAD
000104                            L     R1,0(,R2)
000108                   PASTLOAD M     R4,=F'9'


000100                            B     *+8
000104                            L     R1,0(,R2)
000108                            M     R4,=F'9'

*+8  is interpreted as the value of the location counter before
     generation of the instruction plus 8

PRO:  avoid cluttering up a program with a bunch of labels

CON:  must be updated if instructions are added/deleted

 

Altering the location counter value

The value of the location counter can be altered by using the ORG instruction.

Format 1:   ORG   address     comment

  - sets the location counter value to the specified address

Format 2:   ORG   ,           comment

  - sets the location counter value to the next available unused
    location in the program

Similar to COBOL's REDEFINES clause




Example 1:  Suppose that the routine BUILD has to start at address
            000450.  It can be positioned at the address using ORG

Loc Cntr Value           Assembler Code

                                  ORG   X'000450'
000450                   BUILD    DS    0H
000450                            STM   R0,R15,BSAVE
000454                            LM    R3,R5,0(R1)
000458                            ...

Example 2:  Suppose that an input record can have 2 formats.  The
            format of the record depends on the first character.
            ORG can be used to define storage so NAMED areas of
            storage can be referenced in the code, rather than
            using displacements.

Name:  1         Code N          Address:  1         Code A
       2  - 16   First Name                2  - 41   Address
       17 - 31   Last Name                 42 - 61   City
       32 - 80   Unused                    62 - 63   State
                                           64 - 80   Unused

ASSEMBLER code before ORG:

Loc Cntr Value     Assembler Code
000080             BUFFER   DS    CL80      Input buffer
0000D0             PLINE    DC    CL1'-'    Print line for records
0000D1                      DC    CL131' '


In the code:

         XREAD BUFFER,80               Read a record
         CLI   BUFFER,C'N'             Check for name record
         BNE   ADDR                    Goto next check if not N
         MVC   PLINE+10(15),BUFFER+1   Move first name to print line
         MVC   PLINE+30(15),BUFFER+16  Move last name to print line
         B     PRINT                   Print the line
*
ADDR     CLI   BUFFER,C'A'             Check for address record
         BNE   ERROR                   Goto error routine if not A
         MVC   PLINE+12(40),BUFFER+1   Move address to print line
         MVC   PLINE+60(20),BUFFER+41  Move the city to print line
         MVC   PLINE+85(2),BUFFER+61   Move the state to print line
         B     PRINT                   Print the line
*
ERROR    MVC   PLINE+1,=C'*** Error: invalid record ***'
PRINT    XPRNT PLINE,132               Print the line
         



ASSEMBLER code after ORG:

Loc Cntr Value     Assembler Code

000080             BUFFER   DS    CL80
                            ORG   BUFFER    change LCV to 000080
000080             CODE     DS    CL1
000081             RESTREC  DS    CL79
                            ORG   RESTREC   change LCV to 000081
000081             FIRST    DS    CL15
000090             LAST     DS    CL15
                            ORG   RESTREC   change LCV to 000081
000081             ADDRESS  DS    CL40
0000A9             CITY     DS    CL20
0000BD             STATE    DS    CL2
                            ORG   ,         change LCV to 0000D0
0000D0             PLINE    DC    CL1'-'


In the code:

         XREAD BUFFER,80              Read a record
         CLI   CODE,C'N'              Check for name record
         BNE   ADDR                   Goto next check if not N
         MVC   PLINE+10(15),FIRST     Move first name to print line
         MVC   PLINE+30(15),LAST      Move last name to print line
         B     PRINT                  Print the line
*
ADDR     CLI   CODE,C'A'              Check for address record
         BNE   ERROR                  Goto error routine if not A
         MVC   PLINE+12(40),ADDRESS   Move address to print line
         MVC   PLINE+60(20),CITY      Move the city to print line
         MVC   PLINE+85(2),STATE      Move the state to print line
         B     PRINT                  Print the line
*
ERROR    MVC   PLINE+1,=C'*** Error: invalid record ***'
PRINT    XPRNT PLINE,132              Print the line