News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Accessing and array issue

Started by bcddd214, April 24, 2011, 08:52:31 PM

Previous topic - Next topic

bcddd214

Following some instruction I am producing an output that I think has me on the right track.

Goal:
Randomly produce values and store there paired sum into an array.
THEN
test array values and count the number of reoccurring digits

there are '3' Threes
there are '1' twos

etc

I used some code from the a book to see if the pointer could even access the array  and surprisingly, on the first shot, I think I got most of it.

I am still not testing values yet but the output indicates I might definitely be on the right track.

Is my AccessArray PROC doing what it is supposed and now I just need to test values?


**********************code****************************

        TITLE   Random

        INCLUDE Irvine32.inc

RandLoop PROTO  :DWORD,:DWORD
RandLoop2 PROTO  :DWORD,:DWORD,:DWORD

;#########################################################

COUNT   = 10
COUNT2   = 2
PDWORD TYPEDEF PTR DWORD
;#########################################################

        .DATA?
MyArray dd 100 dup(?) ;creates an empty array of 100 bytes

        .DATA
AryPtr dd MyArray         ;a dword value that tells you the current position in the array
commaStr BYTE ", ",0
str1 BYTE "Total=  ",0
Index       dd 0        ; define this Index
VALUE_FINAL dd 0
arrayD DWORD ", ",0   ;initialize arrayD to hold aray data
ptr1 PDWORD arrayD

;#########################################################

        .CODE

RandLoop2 PROC   dwMinVal2:DWORD,dwMaxVal2:DWORD,COLUMN:DWORD
;this procedure show X columns of random value betwen dwMinVal and dwMaxVal
;this procedure add one colum to show the sum of values
        LOCAL   dwRange2:DWORD
;LOCAL VALUE_FINAL:DWORD

mov VALUE_FINAL,0 ;we initialize this variable with zero
;cmp COLUMN,0 ;zero columns?
;mov COUNT2,0 ;set count2 to zero
        mov     esi,AryPtr
JE DO_NOTHING ;so do nothing
        mov     eax,dwMaxVal2
        sub     eax,dwMinVal2
        mov     dwRange2,eax
        mov     edx,OFFSET commaStr
      mov     ecx,COUNT2
      
   RLoop1:
      mov     eax,dwRange2
        call    RandomRange
        add     eax,dwMinVal2
      add [VALUE_FINAL],eax ;first moment the value_final is zero, second moment is ????????
      call    WriteInt
        call    WriteString
      loop    RLoop1
      mov edx, offset str1 ;we show the "total= "
        call    WriteString
        mov eax,VALUE_FINAL ;and after we show the sum of the numbers
        call WriteInt
      call array1
;      call AccessArray
;      call DumpRegs
        call    Crlf ;an enter in the end of column

DO_NOTHING:
        ret
RandLoop2 ENDP

array1 PROC
      mov     ebx, Index
      mov     eax, VALUE_FINAL
      mov     [esi+ebx], eax    ;store EAX into the array
      add     ebx, 4               ;point to next dword
      mov     Index, ebx
      call AccessArray
      ret
array1 ENDP

AccessArray PROC
   mov edi,ptr1
   mov al, [edi]
   mov edi, arrayD
   AccessArray ENDP

ShowArray       proc
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     eax, [esi+ebx]    ; get EAX from the array
                add     ebx, 4            ; point to next dword
                call WriteInt
;            call Crlf
            jmp     _next
ShowArray       endp
      
main    PROC
        call    Clrscr     
        call    Randomize      ;initialize random generator
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
        call    Crlf
      call ShowArray
      call DumpRegs
        exit
   
main    ENDP

;#########################################################

        END     main

mineiro

Is my AccessArray PROC doing what it is supposed and now I just need to test values?
Remember that every call have a ret, you forget to put a ret in the end of AccessArray proc.

KeepingRealBusy

Quote from: KeepingRealBusy on April 24, 2011, 10:55:11 PM
Something nagged at me so I went back and found my Kip library. RandomRange returns a random number between 0 and n-1, so you will never get the last value. You have to increase the n value by 1 just before you call RandomRange to get the full range of possibilities. Picky, Picky, Picky.

Dave.

RuiLoureiro

#3
1. It seems you dont want to access the array inside array1 proc
    remove your AccessArray and call    AccessArray;
   
2. I dont know what you want to do but...

   Add this to your code to count how many digits

.DATA
arrayD dd 10 dup (0)    ; initialize arrayD to hold array data


Array2          proc

                mov     edi, offset arrayD      ; new array
               
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
                ;
        @@:     mov     edx, [esi+ebx]          ; get EDX from the array
                add     ebx, 4                  ; point to next dword
                ;
                shl     edx, 2                  ; multiply by 4
                add     dword ptr [edi+edx], 1               
                jmp     _next
Array2          endp

ShowArray2      proc

                mov     edi, offset arrayD               
                xor     ebx, ebx
                ;
        @@:     mov     eax, ebx
                call    WriteInt                ; show index

                mov        edx, ebx
                shl           edx, 2               ; multiply by 4
                mov     eax, [edi+edx]          ; get EAX from the array D
                call    WriteInt                ; number of times
                ;
                call    Crlf
               
                add     ebx, 1
                cmp     ebx, 10
                jb      @B
                ret
ShowArray2      endp

main    PROC
        call    Clrscr     
        call    Randomize      ;initialize random generator
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      call    Crlf
      call    ShowArray
      ;
      call    Array2            ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      call    ShowArray2        ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      ;
      call    DumpRegs
        exit   
main    ENDP

RuiLoureiro

Quote
...
THEN
test array values and count the number of reoccurring digits

    We dont need to test array values to count the number of reoccurring digits
    The Array2 procedure does this, it uses arrayD

              index                arrayD
              -----                -------
        number 0    -> number of 0 digits
        number 1    -> number of 1 digits
        number 2    -> number of 2 digits       
        ...
        number 8    -> number of 8 digits       
        number 9    -> number of 9 digits
       
    ShowArray2 shows that table


ShowArray2      proc

                mov     edi, offset arrayD               
                xor     ebx, ebx                ; set ebx to 0
                ;
        @@:     mov     eax, ebx
                call    WriteInt                ; show digit

                mov     edx, offset commaStr
                call    WriteString

                mov     edx, ebx
                shl     edx, 2                  ; multiply by 4
                mov     eax, [edi+edx]          ; get EAX from the array D
                call    WriteInt                ; number of times of that digit
                ;
                call    Crlf
               
                add     ebx, 1
                cmp     ebx, 10
                jb      @B
                ret
ShowArray2      endp   


bcddd214

I am way off somewhere....?
:(


******************code**************************
        TITLE   Random

        INCLUDE Irvine32.inc

RandLoop PROTO  :DWORD,:DWORD
RandLoop2 PROTO  :DWORD,:DWORD,:DWORD

;#########################################################

COUNT   = 10
COUNT2   = 2
PDWORD TYPEDEF PTR DWORD
;#########################################################

        .DATA?
MyArray dd 100 dup(?) ;creates an empty array of 100 bytes

        .DATA
AryPtr dd MyArray         ;a dword value that tells you the current position in the array
commaStr BYTE ", ",0
str1 BYTE "Total=  ",0
Index       dd 0        ; define this Index
VALUE_FINAL dd 0
arrayD DWORD ", ",0   ;initialize arrayD to hold aray data
ptr1 PDWORD arrayD

;#########################################################

        .CODE

RandLoop2 PROC   dwMinVal2:DWORD,dwMaxVal2:DWORD,COLUMN:DWORD
;this procedure show X columns of random value betwen dwMinVal and dwMaxVal
;this procedure add one colum to show the sum of values
        LOCAL   dwRange2:DWORD
;LOCAL VALUE_FINAL:DWORD

mov VALUE_FINAL,0 ;we initialize this variable with zero
;cmp COLUMN,0 ;zero columns?
;mov COUNT2,0 ;set count2 to zero
        mov     esi,AryPtr
JE DO_NOTHING ;so do nothing
        mov     eax,dwMaxVal2
        sub     eax,dwMinVal2
        mov     dwRange2,eax
        mov     edx,OFFSET commaStr
      mov     ecx,COUNT2
      
   RLoop1:
      mov     eax,dwRange2
        call    RandomRange
        add     eax,dwMinVal2
      add [VALUE_FINAL],eax ;first moment the value_final is zero, second moment is ????????
      call    WriteInt
        call    WriteString
      loop    RLoop1
      mov edx, offset str1 ;we show the "total= "
        call    WriteString
        mov eax,VALUE_FINAL ;and after we show the sum of the numbers
        call WriteInt
;      call array1
      call Array2
;      call AccessArray
      call ShowArray2
;      call DumpRegs
        call    Crlf ;an enter in the end of column

DO_NOTHING:
        ret
RandLoop2 ENDP

array1 PROC
      mov     ebx, Index
      mov     eax, VALUE_FINAL
      mov     [esi+ebx], eax    ;store EAX into the array
      add     ebx, 4               ;point to next dword
      mov     Index, ebx
      call AccessArray
      ret
array1 ENDP

Array2          proc
                mov     edi, offset arrayD      ; new array
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     edx, [esi+ebx]          ; get EDX from the array
                add     ebx, 4                  ; point to next dword
                ;
                shl     edx, 2                  ; multiply by 4
                add     dword ptr [edi+edx], 1               
                jmp     _next
Array2          endp

AccessArray PROC
   mov edi,ptr1
   mov al, [edi]
   mov edi, arrayD
   ret
;   commenting the above 'ret' reveals an error that shows the ptr's working.
;   uncommenting will hide it!
   AccessArray ENDP

ShowArray       proc
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     eax, [esi+ebx]    ; get EAX from the array
                add     ebx, 4            ; point to next dword
                call WriteInt
;            call Crlf
            jmp     _next
            ret
ShowArray       endp

ShowArray2      proc

                mov     edi, offset arrayD               
                xor     ebx, ebx                ; set ebx to 0
                ;
        @@:     mov     eax, ebx
                call    WriteInt                ; show digit
                mov     edx, offset commaStr
                call    WriteString
                mov     edx, ebx
                shl     edx, 2                  ; multiply by 4
                mov     eax, [edi+edx]          ; get EAX from the array D
                call    WriteInt                ; number of times of that digit
                call    Crlf
                add     ebx, 1
                cmp     ebx, 10
                jb      @B
                ret
ShowArray2      endp   

      
main    PROC
        call    Clrscr     
        call    Randomize      ;initialize random generator
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
        call    Crlf
      call ShowArray
      call DumpRegs
        exit
   
main    ENDP

;#########################################################

        END     main

RuiLoureiro

Hi bcddd214,
            1. Please your AccessArray proc is completely wrong
               It does nothing of nothing, only errors...
Quote
;   commenting the above 'ret' reveals an error that shows the ptr's working.
;   uncommenting will hide it!

            This doesnt help you, it is wrong
             
            2. When you invoke RandLoop2, you build an array called MyArray
               with the sums...

            3. After «INVOKE  RandLoop2,1,6,0» 10 times, we call Array2
               to build an array called arrayD. This is built from MyArray 

            4. At the end we call ShowArray2 to show arrayD
           
            Try this code and say what it does
            (i didnt test it, i havent Irvine32.inc)
            Try to understand what is done

TITLE   Random

        INCLUDE Irvine32.inc

RandLoop PROTO  :DWORD,:DWORD
RandLoop2 PROTO  :DWORD,:DWORD,:DWORD

;#########################################################

COUNT   = 10
COUNT2   = 2
PDWORD TYPEDEF PTR DWORD
;#########################################################

        .DATA?
MyArray dd 100 dup(?) ;creates an empty array of 100 bytes

        .DATA
AryPtr dd MyArray         ;a dword value that tells you the current position in the array
commaStr BYTE ", ",0
str1 BYTE "Total=  ",0
Index       dd 0        ; define this Index
VALUE_FINAL dd 0
;arrayD DWORD ", ",0   ;initialize arrayD to hold aray data
;ptr1 PDWORD arrayD

arrayD dd 10 dup (0)    ; initialize arrayD to hold array data

;#########################################################

        .CODE

;this procedure show X columns of random value betwen dwMinVal and dwMaxVal
;this procedure add one colum to show the sum of values
RandLoop2 PROC   dwMinVal2:DWORD,dwMaxVal2:DWORD,COLUMN:DWORD
          LOCAL   dwRange2:DWORD
          ;LOCAL VALUE_FINAL:DWORD

mov VALUE_FINAL,0 ;we initialize this variable with zero
;cmp COLUMN,0 ;zero columns?
;mov COUNT2,0 ;set count2 to zero
        mov     esi,AryPtr
JE DO_NOTHING ;so do nothing
        mov     eax,dwMaxVal2
        sub     eax,dwMinVal2
        mov     dwRange2,eax
        mov     edx,OFFSET commaStr
      mov     ecx,COUNT2
     
   RLoop1:
        mov     eax,dwRange2
        call    RandomRange
        add     eax,dwMinVal2
        add     [VALUE_FINAL],eax ;first moment the value_final is zero, second moment is ????????
        call    WriteInt
        call    WriteString
      loop    RLoop1
     
        mov     edx, offset str1    ; we show the "total= "
        call    WriteString
       
        mov     eax, VALUE_FINAL    ; and after we show the sum of the numbers
        call    WriteInt
        call    Crlf                ; an enter in the end of column

        call    array1              ; Set VALUE_FINAL into MyArray
;       call    DumpRegs

DO_NOTHING:
        ret
RandLoop2 ENDP

;--------------------------
; ESI   points to MyArray
;
array1          proc

                mov     esi, offset MyArray
                mov     ebx, Index
                mov     eax, VALUE_FINAL
                mov     [esi+ebx], eax       ;store EAX into the MyArray
                add     ebx, 4               ;point to next dword
                mov     Index, ebx
                ret
array1          endp
;--------------------------
; ESI   points to MyArray
;
Array2          proc

                mov     esi, offset MyArray
                mov     edi, offset arrayD      ; EDI points to arrayD
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     edx, [esi+ebx]          ; get EDX from the MyArray
                add     ebx, 4                  ; point to next dword
                ;
                shl     edx, 2                  ; multiply by 4
                add     dword ptr [edi+edx], 1               
                jmp     _next
Array2          endp

;AccessArray PROC
;   mov edi,ptr1
;   mov al, [edi]
;   mov edi, arrayD
;   ret
;   commenting the above 'ret' reveals an error that shows the ptr's working.
;   uncommenting will hide it!
;   AccessArray ENDP

ShowArray       proc

                mov     esi, offset MyArray
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     eax, [esi+ebx]    ; get EAX from the array
                add     ebx, 4            ; point to next dword
                call WriteInt
;            call Crlf
            jmp     _next
            ret
ShowArray       endp

ShowArray2      proc

                mov     edi, offset arrayD               
                xor     ebx, ebx                ; set ebx to 0
                ;
        @@:     mov     eax, ebx
                call    WriteInt                ; show digit
                mov     edx, offset commaStr
                call    WriteString
                mov     edx, ebx
                shl     edx, 2                  ; multiply by 4
                mov     eax, [edi+edx]          ; get EAX from the arrayD
                call    WriteInt                ; number of times of that digit
                call    Crlf
                add     ebx, 1
                cmp     ebx, 10
                jb      @B
                ret
ShowArray2      endp   

     
main    PROC
        call    Clrscr     
        call    Randomize      ;initialize random generator
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0

        call  Array2

        call  Crlf
        call  ShowArray         ; show digits in MyArray
       
        call  Crlf       
        call  ShowArray2        ; show frequency table
       
        call  DumpRegs
        exit
   
main    ENDP
;#########################################################
        END     main


bcddd214

Worked like a champ!

I am breaking it down now..   :)

        TITLE   Random

        INCLUDE Irvine32.inc

RandLoop PROTO  :DWORD,:DWORD
RandLoop2 PROTO  :DWORD,:DWORD,:DWORD

;#########################################################

COUNT   = 10
COUNT2   = 2
PDWORD TYPEDEF PTR DWORD
;#########################################################

        .DATA?
MyArray dd 100 dup(?) ;creates an empty array of 100 bytes

        .DATA
AryPtr dd MyArray         ;a dword value that tells you the current position in the array
commaStr BYTE ", ",0
str1 BYTE "Total=  ",0
Index       dd 0        ; define this Index
VALUE_FINAL dd 0
;arrayD DWORD ", ",0   ;initialize arrayD to hold aray data
;ptr1 PDWORD arrayD
arrayD dd 10 dup (0)

;#########################################################

        .CODE

RandLoop2 PROC   dwMinVal2:DWORD,dwMaxVal2:DWORD,COLUMN:DWORD
        LOCAL   dwRange2:DWORD
;LOCAL VALUE_FINAL:DWORD

mov VALUE_FINAL,0 ;we initialize this variable with zero
        mov     esi,AryPtr
JE DO_NOTHING ;so do nothing
        mov     eax,dwMaxVal2
        sub     eax,dwMinVal2
        mov     dwRange2,eax
        mov     edx,OFFSET commaStr
      mov     ecx,COUNT2
      
   RLoop1:
      mov     eax,dwRange2
        call    RandomRange
        add     eax,dwMinVal2
      add [VALUE_FINAL],eax ;first moment the value_final is zero, second moment is ????????
      call    WriteInt
        call    WriteString
      loop    RLoop1
      mov edx, offset str1 ;we show the "total= "
        call    WriteString
        mov eax,VALUE_FINAL ;and after we show the sum of the numbers
        call WriteInt
        call Crlf ;an enter in the end of column
      call array1
      call DumpRegs

DO_NOTHING:
        ret
RandLoop2 ENDP

;
array1          proc

                mov     esi, offset MyArray
                mov     ebx, Index
                mov     eax, VALUE_FINAL
                mov     [esi+ebx], eax       ;store EAX into the MyArray
                add     ebx, 4               ;point to next dword
                mov     Index, ebx
                ret
array1          endp
;--------------------------
; ESI   points to MyArray
;
Array2          proc

                mov     esi, offset MyArray
                mov     edi, offset arrayD      ; EDI points to arrayD
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     edx, [esi+ebx]          ; get EDX from the MyArray
                add     ebx, 4                  ; point to next dword
                ;
                shl     edx, 2                  ; multiply by 4
                add     dword ptr [edi+edx], 1               
                jmp     _next
Array2          endp


ShowArray       proc

                mov     esi, offset MyArray
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     eax, [esi+ebx]    ; get EAX from the array
                add     ebx, 4            ; point to next dword
                call WriteInt
;            call Crlf
            jmp     _next
            ret
ShowArray       endp

ShowArray2      proc

                mov     edi, offset arrayD               
                xor     ebx, ebx                ; set ebx to 0
                ;
        @@:     mov     eax, ebx
                call    WriteInt                ; show digit
                mov     edx, offset commaStr
                call    WriteString
                mov     edx, ebx
                shl     edx, 2                  ; multiply by 4
                mov     eax, [edi+edx]          ; get EAX from the array D
                call    WriteInt                ; number of times of that digit
                call    Crlf
                add     ebx, 1
                cmp     ebx, 10
                jb      @B
                ret
ShowArray2      endp   

      
main    PROC
        call    Clrscr     
        call    Randomize      ;initialize random generator
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
      INVOKE  RandLoop2,1,6,0
       
      call Array2
      call    Crlf
      call ShowArray
      call    Crlf
      call SHowArray2
      call DumpRegs
        exit
   
main    ENDP

;#########################################################

        END     main

bcddd214

couple of questions for you my friend:
When you get to Array2:
you mov esi, offset MyArray ;again?
Was this not done in array1?

I missing the connect.

and a little further down you do a trick with
jne     @F
                ret
        @@:     mov     edx, [esi+ebx]

in two places I was hoping you could break it down for me just a little. I am sure this is where you counted digits but I am just not following.

mineiro

Quote from: bcddd214 on April 27, 2011, 01:30:22 AM
couple of questions for you my friend:
When you get to Array2:
you mov esi, offset MyArray ;again?
Was this not done in array1?

I missing the connect.
In array1, you build the array, now you like to count how many times each number appears in array1, this is why he uses it in array2.

Quote
and a little further down you do a trick with
jne     @F
                ret
        @@:     mov     edx, [esi+ebx]

in two places I was hoping you could break it down for me just a little. I am sure this is where you counted digits but I am just not following.
"@F" means Foward, so the compiler will search for the next label "@@:"
is the same if you put some name in that place like:
jne to_foward
ret
to_foward: mov edx,[esi+ebx]
In masm, we use it when we don't like to insert a name.

Have @B too, that means Back, an example that do nothing.
@@:
cmp eax,0
jne @F   ;this will jump to the below @@:
je @B     ;this will jump to the above @@:
@@:

bcddd214

Thank you.

Can you send me a link on reading material for @ and forwards?
New turf and I need to read so I don't sound too stoopid.
:)

RuiLoureiro

Hi bcddd214,
Quote
and a little further down you do a trick with
jne     @F
                ret
        @@:     mov     edx, [esi+ebx]

in two places I was hoping you could break it down for me just a little.
I am sure this is where you counted digits but I am just not following.

        1. mineiro explained well how to use jump @F and jump @B to the label @@
           
        2. No, this is not where we count digits. It is inside Array2

Quote       
Array2          proc

                mov     esi, offset MyArray
                mov     edi, offset arrayD      ; EDI points to arrayD
                xor     ebx, ebx
    _next:      cmp     ebx, Index
                jne     @F
                ret
        @@:     mov     edx, [esi+ebx]          ; get EDX from the MyArray
                add     ebx, 4                  ; point to next dword
                ;
                shl     edx, 2                  ; multiply by 4
                add     dword ptr [edi+edx], 1  ;<<<<<<<<<<<<<<<<<<<<< HERE we COUNT             
                jmp     _next
Array2          endp

        3. First we have arrayD[0]=0, arrayD[1]=0, ..., arrayD[8]=0, arrayD[9]=0
           Now, suppose EDX=6.
           Then we make arrayD[6]=arrayD[6]+1
           If EDX is =6 again, then arrayD[6]=arrayD[6]+1  so, arrayD[6]=2. Ok ?               
           Note that each element in the array is 4 bytes: this is why
           we need to multiply EDX by 4 and then access the arrayD from the
           starting point

        4. I decided to point the array with
                «mov     esi, offset MyArray» or  «mov     edi, offset arrayD»
           whenever i want to use it in array1, Array2, ShowArray and ShowArray2
           In this way we dont need to use AryPtr