Packed decimal data fields are created by specifying a P for the type in a DC or DS declarative. In this format, when assembled, each byte in the field contains 2 decimal digits except the right-most byte in the field which contains a decimal digit followed by a sign. The valid positive signs are the hexadecimal characters A, C, E, and F. The valid negative signs are the hexadecimal characters B and D. The preferred signs, those which are generated by the machine or chosen by the assembler, are positive C and negative D. It is standard practice to use C and D, but be aware that the other signs are recognized as well. Consider the two fields defined below,





In the first example the assembler generates x00020C for AMOUNT1 and x034D for AMOUNT2.


A packed decimal field can be created using either of the following formats,

name DC dPLnconstant


name DS dPLn


where name is an optional field name

d is a duplication factor used to create consecutive copies of the field (default = 1copy)

P represents the packed decimal data type

L represents an optional length (default = 1 byte)

n is the number of bytes in the field

constant is the initial value of the field in decimal format. Optionally, a decimal

point and a + or - sign can be coded but the decimal point is not assembled.


It is important to note that if a name for a field is specified, it will represent the address of the first byte of the field. Additionally, the name of the field will be associated with a length attribute which equals the number of bytes in the field. If the Ln construction is omitted in a DC, the length will be just large enough to accommodate the digits specified in the constant (along with a padded 0 on the left if the number of digits in the constant is even). In a DS declarative, Ln must be coded. The length of a packed field defined using a DC or DS is limited to a maximum of 16 bytes. This limits the size of decimal fields to 31 digits.


During assembly, fields that were defined consecutively in the source with DCs or DSs are assigned consecutive storage locations in the program according to the value of the location counter which is maintained by the assembler. For example, in the fields below, if PKD1 is associated with address x1000, then PKD2 is located at x1008 and PKD3 is located at x1011.



1000 PKD1 DS PL8

1008 PKD2 DC PL920

1011 PKD3 DS PL3

Some Typical DSs and DCs:

R DS PL8 An 8-byte field reserved for packed data

S DS PL16 The maximum size of a packed field (31 digits)

T DS PL1 The minimum size of a packed field (1 digit)

U DS 3PL4 Three consecutive packed fields (U refers to

the first field)

V DC P123 V = x123C, field is assumed positive

W DC P-123 W = x123D

X DC P12 X = x012C, field padded with a 0 to fill

up 2 bytes

Y DC PL412 Y = x0000012C, constant shorter than the

field length - padded

Z DC PL212345 Z = x345C, constant too big, truncation

occurs on the left

DOG DC P123.45 DOG = x12345C, decimal is treated as a

comment, not assembled



1. Be sure and use DC instead of DS when providing a constant. Consider the example below,



The assembler will not complain about you providing a constant on a DS statement. It will, however, ignore the constant and treat it as a comment. The field remains uninitialized.


2.      Be sure to make any packed fields you define large enough to hold any possible values that might be developed in them. You cannot err by overestimating the size of a packed field. On the other hand, it is disastrous to underestimate the size of a packed field - this will result in truncation of digits in arithmetic operations (decimal overflow exception).


3.      The specification of P as the type of data does not insure that the data is packed. In fact,

many kinds of data might be stored in a packed field.