Summary of literal rules

  1. S-type address constants can be used in literals.
  2. Location counter references (*) can be used in address constants.
  3. When a literal address constant contains *, each use of that literal is assigned a separate location in the literal pool.
  4. When a literal address constant contains *, the value used for * is the address of the (single) instruction in which the literal is used.

    When not in a literal, * in an address constant refers to the first byte of the constant.

  5. When a literal address constant containing * also has a duplication factor, the value of * does not change for each duplication, but remains equal to the address if the first byte of the instruction in which the literal was used.

    When not in a literal, if an address constant containing * is duplicated, the value of * is updated for each duplication to refer to the address of that duplication.

  6. When an S-type address constant is used in a literal, regardless of whether it contains *, the base register that is used to compute the base and displacement that are parts of the S-type address constant is determined by the USING statements that are in effect at the place that the literal is assembled, not the USING statements in effect at the place where the literal is referenced in an instruction. There are two different base-displacement calculations: one in the instruction referring to the S-type address constant, and one in the S-type address constant to determine how to address the object of the constant.