int x[100]; short y[100]; byte z[100]; int i; short j; byte k;
x[i + j] = y[i + k] + z[j + k];
(1) Get y[i + k]: MOVEA.L #y, A0 A0 = base address of array "y" MOVE.L i, D0 D0 = i (32 bits) MOVE.B k, D1 D1 = k (8 bits) *** Can't add i + k yet ! EXT.W D1 D1 = k (16 bits) EXT.L D1 D1 = k (32 bits) *** now we can add i + k ! ADD.L D1, D0 D0 = i + k (32 bits), index, NOT offset MULS #2, D0 Because elements in array "y" are short MOVE.W 0(A0,D0.W), D7 D7 = y[i + k] (16 bits) (2) Get z[j + k]: MOVEA.L #z, A0 A0 = base address of array "z" MOVE.W j, D0 D0 = j (16 bits) MOVE.B k, D1 D1 = k (8 bits) *** Can't add j + k yet ! EXT.W D1 D1 = k (16 bits) *** now we can add j + k ! ADD.W D1, D0 D0 = j + k (16 bits), index, NOT offset MULS #1, D0 Because elements in array "z" are bytes (You can omit this instruction....) MOVE.B 0(A0,D0.W), D6 D6 = z[j + k] (8 bits) (3) Add them: *** Can't D7 = y[i + k] (16 bits) *** and D6 = z[j + k] (8 bits) yet ! *** because: WRONG SIZE !!! EXT.W D6 D6 = z[j + k] (16 bits) ADD.W D6, D7 D7 (16 bits) = y[i + k] + z[j + k] +++ NOTE: Do NOT use D7 in any computation ! +++ You need it later !!! (4) Get the address of x[i + j]: MOVEA.L #x, A0 A0 = base address of array "x" MOVE.L i, D0 D0 = i (32 bits) MOVE.W j, D1 D1 = j (16 bits) *** Can't add i + j yet ! EXT.L D1 D1 = j (32 bits) *** now we can add i + j ! ADD.L D1, D0 D0 = i + j (32 bits), index, NOT offset MULS #4, D0 Because elements in array "y" are short *** Now 0(A0, D0.W) is the address of *** x[i + j] (5) Put the value of the sum computed previously in 0(A0, D0.W): *** Can't do: MOVE.L D7, 0(A0, D0.W) *** because: *** D7 = y[i + k] + z[j + k] (16 bits) *** and x[i + j] is 32 bits EXT.L D7 MOVE.L D7, 0(A0, D0.W)DONE... finally...
Now take a look back at the mess we made just to do the simple looking addition "x[i + j] = y[i + k] + z[j + k]"..... Almost a FULL PAGE of assembler code...