4.4 Non-EAX/AX/AL expressions

------------------------------

Such expressions are used when the result must be saved to any register

other than EAX, AX or AL. When calculating this type of expression, only

the contents of the destination register changes, and all other registers

are preserved. If the destination register is a byte register and

calculation makes use of values are large as a word, when one writes to the

trailing byte the contents of the leading byte of the destination register

may also be destroyed.

This places some limits on operations and operands permitted in

EAX/AX/AL expressions. In byte-type expressions one cannot:

call a macro function

call a register function

call a stack function

Non-EAX/AX/AL expressions used to be allowed use of only the following

operations: addition, subtraction, XOR, OR, and AND. Now there are far

fewer such restrictions for 16 and 32-bit registers, but a few restrictions

still remain. For instance if the expression contains a shift to the value

of a variable and the destination is register CX or ECX this expression is

compiled as follows:

CX = var * SI * 3 * var >> 3; //generates an error message

Note: for 8-bit non-AL expressions you can multiply only by 0, 1, 2, 4,

8, 16, 32, 64, or 128. All these restrictions are related to the preference

for not destroying other registers when using non-EAX/AX/AL expressions.