Microsoft KB Archive/11535

HIGH Operator Problem ID Number: Q11535

4.00 MS-DOS

Problem:

The HIGH operator assembles incorrectly for negative numbers. For example, the following program produces “00” instead of “PH”:

_DATA SEGMENT WORD PUBLIC ‘DATA’

DB HIGH (-1)

_DATA ENDS

END

Response:

The problem stems from the assembler performing 17-bit, signed magnitude arithmetic internally, i.e., -1 is represented by 1 with another bit saying that it is negative.

The HIGH operator is currently implemented as follows:


 * 1) Take the high byte of the 16-bit argument.
 * 2) If it is negative, take the two’s complement.

This procedure produces the following results:

HIGH( -1 ) ==> HIGH( -0001H ) ==> - 00 ==> FFH + 1 ==> 00 HIGH( -32767 ) ==> HIGH( -7FFF ) ==> - 7F ==> 80H + 1 ==> 81H

The correct behavior would be to switch steps 1 and 2. This process was implemented in the Macro Assembler Version 5.00.

A workaround to this problem is to avoid using the HIGH operator on negative numbers and code the desired value directly.