News:

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

Array question

Started by bcddd214, April 24, 2011, 03:00:44 PM

Previous topic - Next topic

RuiLoureiro

Another solution

.DATA
Index            dd 0        ; define this Index
VALUE_FINAL dd 0


Replace this:

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

by this:

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


AND
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       
       ret
array1 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
       
                ; »»»»»»»»»»»»»
                ; print it HERE
                ; »»»»»»»»»»»»»       
                jmp     _next
                               
ShowArray       endp


bcddd214

The first thing it barks at is undefined symbol of FINAL_VALUE and INDEX
I figure out that FINAL_VALUE is defined in the RandLoop PROC and can't reach the reach it in the subroutine.

Do I simply set FINAL_VALUE right under .code to be global and put index there too?

RuiLoureiro

Quote from: bcddd214 on April 24, 2011, 07:00:02 PM
The first thing it barks at is undefined symbol of FINAL_VALUE and INDEX
I figure out that FINAL_VALUE is defined in the RandLoop PROC and can't reach the reach it in the subroutine.

Do I simply set FINAL_VALUE right under .code to be global and put index there too?

yes, but under .DATA
.DATA
Index       dd 0        ; define this Index
VALUE_FINAL dd 0

dedndave

or - return it from the routine in EAX
then, store it

RuiLoureiro

Another way:

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       
       ret
array1 ENDP

and         
         mov     eax, VALUE_FINAL
         call    array1

;.....................

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
       
                ; »»»»»»»»»»»»»
                ; print it HERE
                ; »»»»»»»»»»»»»       
                jmp     _next
                               
ShowArray       endp

bcddd214

This method does not error, but also does not show the array??
Trying the other way now.

        TITLE   Random

        INCLUDE Irvine32.inc

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

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

COUNT   = 10
COUNT2   = 2
;#########################################################

        .DATA?
MyArray db 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

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

        .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,COLUMN
      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
      add [VALUE_FINAL],edx
      call array1
;      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       
       ret
array1 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
       
                ; »»»»»»»»»»»»»
                ; print it HERE
                ; »»»»»»»»»»»»»       
                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 DumpRegs
        exit
   
main    ENDP

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

        END     main

RuiLoureiro

First:

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
       
                ; »»»»»»»»»»»»»
                ; print it HERE
                ; »»»»»»»»»»»»»       
                call    WriteInt            ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                jmp     _next
                               
ShowArray       endp

Second:

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

RuiLoureiro

It seems there is an error HERE:

Why to add EDX to VALUE_FINAL  ????????

mov edx, offset str1 ;we show the "total= "
        call    WriteString
        mov eax,VALUE_FINAL
        call WriteInt
      ;add [VALUE_FINAL],edx            <<<<<<<<<<<<<<Remove this line
      call array1
;      call DumpRegs
        call    Crlf

RuiLoureiro

You need to do this (or NOT if VALUE_FINAL is global ):

         mov     eax, VALUE_FINAL
         call    array1

bcddd214

WORKS!

Now I just need to figure out why.

I have never seen that method of displaying an array.
Any chance you could break it down for me?

*****************************output**********************

+1, +3, Total=  +4
+3, +3, Total=  +6
+1, +3, Total=  +4
+1, +1, Total=  +2
+2, +1, Total=  +3
+2, +3, Total=  +5
+4, +5, Total=  +9
+2, +3, Total=  +5
+3, +5, Total=  +8
+2, +1, Total=  +3

+4+6+4+2+3+5+9+5+8+3
  EAX=00000003  EBX=00000028  ECX=00000000  EDX=00405007
  ESI=00405A1C  EDI=00000000  EBP=0012FF94  ESP=0012FF8C
  EIP=00401151  EFL=00000246  CF=0  SF=0  ZF=1  OF=0


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


        TITLE   Random

        INCLUDE Irvine32.inc

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

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

COUNT   = 10
COUNT2   = 2
;#########################################################

        .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

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

        .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,COLUMN
      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 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       
       ret
array1 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
       
                ; »»»»»»»»»»»»»
                ; print it HERE
                ; »»»»»»»»»»»»»       
                call WriteInt
            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

RuiLoureiro

«I have never seen that method of displaying an array»

+4+6+4+2+3+5+9+5+8+3

Try this:

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
       
                ; »»»»»»»»»»»»»
                ; print it HERE
                ; »»»»»»»»»»»»»       
                call    WriteInt            ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                call    Crlf
                jmp     _next
                               
ShowArray       endp

bcddd214

That's what I have my friend!
And she works great.

If I wanted to access this array and see how many of what digits are in that array, I would use TYPEDEF?

RuiLoureiro

«If I wanted to access this array and see how many of what digits are in that array,
I would use TYPEDEF?»

No, the number of digits in that array is in Index. Divide it by 4.
If Index=16 then the number is equal 4
If you want to show

mov     eax, Index
shr     eax, 2              ; divide by 4
call    WriteInt            ; show number of digits in the array

bcddd214

I will start a new topic on this.
It is similar, but different enough that others might want it separate.