pointers
home
xkcd
.. A POINTER is simply a value that is an address
include emu8086.inc org 100h ; move the value stored at the address associated with the label, 'x' mov AX, x ;AX holds the num call PRINT_NUM PRINTN ; mov the address associated with the label, 'x' ;; method 1 lea AX, x call PRINT_NUM PRINTN ;; method 2 mov AX, offset x call PRINT_NUM PRINTN ret x DW 5 DEFINE_PRINT_NUM_UNS DEFINE_PRINT_NUM END ================================================================= [LINE] LOC: MACHINE CODE SOURCE ================================================================= [ 1] : include emu8086.inc [ 2] : org 100h [ 3] : [ 4] : ; move the value stored at the address associated with the label, 'x' [ 5] 0100: A1 61 01 mov AX, x ;AX holds the sum [ 6] 0103: E8 B1 00 call PRINT_NUM [ 7] 0106: 50 56 EB 03 0D 0A 00 BE 0A 01 2E 8A PRINTN 04 3C 00 74 07 46 B4 0E CD 10 EB F2 5E 58 [ 8] : [ 9] : ; mov the address associated with the label, 'x' [ 10] : [ 11] : ;; method 1 [ 12] 0120: B8 61 01 (161 hex = 353 dec) lea AX, x [ 13] 0123: E8 91 00 call PRINT_NUM [ 14] 0126: 50 56 EB 03 0D 0A 00 BE 2A 01 2E 8A PRINTN 04 3C 00 74 07 46 B4 0E CD 10 EB F2 5E 58 [ 15] : [ 16] : ;; method 2 [ 17] 0140: B8 61 01 (161 hex = 353 dec) mov AX, offset x [ 18] 0143: E8 71 00 call PRINT_NUM [ 19] 0146: 50 56 EB 03 0D 0A 00 BE 4A 01 2E 8A PRINTN 04 3C 00 74 07 46 B4 0E CD 10 EB F2 5E 58 [ 20] : [ 21] 0160: C3 ret [ 22] : [ 23] 0161: 05 00 (161 hex = 353 dec) x DW 5 [ 24] : [ 25] 0163: EB 50 50 53 51 52 B9 01 00 BB 10 27 DEFINE_PRINT_NUM_UNS 3D 00 00 74 32 83 FB 00 74 35 83 F9 00 74 04 3B C3 72 14 B9 00 00 BA 00 00 F7 F3 04 30 50 8A C0 B4 0E CD 10 58 8B C2 50 BA 00 00 8B C3 2E F7 36 B3 01 8B D8 58 EB CE 50 B0 30 B4 0E CD 10 58 5A 59 5B 58 C3 0A 00 [ 26] 01B5: EB 26 52 50 3D 00 00 75 0A 50 B0 30 DEFINE_PRINT_NUM B4 0E CD 10 58 EB 12 3D 00 00 79 0A F7 D8 50 B0 2D B4 0E CD 10 58 E8 8B FF 58 5A C3 [ 27] : END ==============================================================

.. An array is just a list
include emu8086.inc org 100h mov AX, array PRINT "The number in the array is " call PRINT_NUM PRINTN mov AX, array + 2 PRINT "The number in the array is " call PRINT_NUM PRINTN mov AX, array + 4 PRINT "The number in the array is " call PRINT_NUM PRINTN mov AX, array + 6 PRINT "The number in the array is " call PRINT_NUM PRINTN ret array DW 12,26,43,13 DEFINE_PRINT_NUM_UNS DEFINE_PRINT_NUM end

WHAT IF YOU DO THIS ?? include emu8086.inc org 100h mov AX, array PRINT "The number in the array is " call PRINT_NUM PRINTN mov AX, array + 1 PRINT "The number in the array is " call PRINT_NUM PRINTN mov AX, array + 2 PRINT "The number in the array is " call PRINT_NUM PRINTN mov AX, array + 3 PRINT "The number in the array is " call PRINT_NUM PRINTN ret array DW 12,26,43,13 DEFINE_PRINT_NUM_UNS DEFINE_PRINT_NUM end
WHAT IF YOU DO THIS ?? include emu8086.inc org 100h ; what if you just want to move ONE BYTE of the data mov AL, array ; NO! NO COMPILE ; must do this mov AL, BYTE PTR array ; OK ret array DW 12,26,43,13 end

.. Summing and Nested Loops: POINTERS & ARRAYS
SUMMING ARRAY ELEMENTS ====================== include emu8086.inc org 100h mov AX, 0 ;AX holds the sum mov CX, count ; holds counter for loop ; EITHER of the following will make ESI point to Arr lea SI, array ; OR mov SI, offset array L1: add AX, [SI] ; de-reference the pointer (why not WORD PTR[si]?) PRINT "The current sum is " call PRINT_NUM PRINTN add SI, 2 ; go to the next WORD loop L1 ret array DW 12,26,43,13,97,16,73,41 ; 321D = 141H count = ($ - array)/2 ; number of WORD elements DEFINE_PRINT_NUM_UNS DEFINE_PRINT_NUM end
NESTED LOOP =========== To code a loop within a loop, you must save the outer loop's CX value. Example: outer loop executes 100 times, and the inner loop 20 times. count DW ? CODE: mov CX, 100 ; set outer loop count L1: outer loop code... outer loop code... mov count, CX ; save outer loop count mov CX, 20 ; set inner loop count L2: inner loop code... inner loop code... loop L2 ; repeat the inner loop mov CX, count ; restore outer loop count loop L1 ; repeat the outer loop