PROGRAMMING NUMERIC APPLICATIONS

Table 2-17. Addressing Mode Examples

Coding

FIAOOALPHA

FOIVRALPHA.BETA

Interpretation

ALPHA is a simple scalar (mode is direct).

BETA is a field in a structure that is "overlaid" on ALPHA (mode is direct).

FMUL

aWORO PTR [BX]

BX contains the address of a long real

 

 

variable (mode is register indirect).

FSUB

ALPHA [SI]

ALPHA is an array and SI contains the

 

 

offset of an array element from the start of

 

 

the array (mode is indexed).

FILO

[BP].BETA

BP contains the address of a structure on

 

 

the CPU stack and BETA is a field in the

 

 

structure (mode is based).

FBLO

TBYTE PTR [BX] [01]

BX contains the address of a packed

 

 

decimal array and 01 contains the offset of

 

 

an array element (mode is based indexed).

Comparative Programming Example

Figures 2-6 and 2-7 show the PLjM-286 and ASM286 code for a simple 80287 program, called ARRSUM. The program references an array (X$ARRAY), which contains 0-100 short real values; the integer variable N$OF$X indicates the number of array elements the program is to consider. ARRSUM steps through X$ARRAY accumulating three sums:

SUM$X, the sum of the array values

SUM$INDEXES, the sum of each array value times its index, where the index of the first element is 1, the second is 2, etc.

SUM$SQUARES, the sum of each array element squared

(A true program, of course, would go beyond these steps to store and use the results of these calcula- tions.) The control word is set with the recommended values: projective closure, round to nearest, 64-bit precision, interrupts enabled, and all exceptions masked invalid operation. It is assumed that an exception handler has been written to field the invalid operation, if it occurs, and that it is invoked by interrupt pointer 16. Either version of the program will run on an actual or an emulated 80287 without altering the code shown.

The PLjM-286 version of ARRSUM (figure 2-6) is very straightforward and illustrates how easily the 80287 can be used in this language. After declaring variables the program calls built-in procedures to initialize the processor (or its emulator) and to load to the control word. The program clears the sum variables and then steps through X$ARRAY with a DO-loop. The loop control takes into account PLjM-286's practice of considering the index of the first element of an array to be o. In the compu- tation of SUM$INDEXES, the built-in procedure FLOAT converts 1+1 from integer to real because the language does not support "mixed mode" arithmetic. One of the strengths of the NPX, of course, is that it does support arithmetic on mixed data types (because all values are converted internally to the 80-bit temporary real format).

2-43

Page 435
Image 435
Intel 80286, 80287 Addressing Mode Examples, Fiaooalpha FOIVRALPHA.BETA, Fsub Alpha SI, Filo BP.BETA, Fblo Tbyte PTR BX