title: Inserting values into array in assembly MASM32
body: <p>I'm having trouble figuring out how to put a value I currently have in register EAX into an array.</p>
  
  <p>The basic function of this program is to take the dates array, convert them to unique numbers, BubbleSort them, and convert them back. </p>
  
  <p>I put the values I find with "datetonum" into EAX, and I want to store those values I find into my array named <code>ra</code>. </p>
  
  <p>I can't seem to figure out how to do something that.<br>
  Seems like it should be fairly simple?</p>
  
  <p>Thanks in advance!</p>
  
  <pre><code>include \masm32\include\masm32rt.inc
  .data
    dates  BYTE "23-JUL-2010", 0, "23-JAN-2010", 0, "23-JUL-2009", 0, "31-JUL-2012", 0, "05-MAR-2010", 0
    months BYTE "JAN",0,"FEB",0,"MAR",0,"APR",0,"MAY",0,"JUN",0,"JUL",0,"AUG",0,"SEP",0,"OCT",0,"NOV",0,"DEC",0
    nDates DWORD 4
    ra     DWORD 1,0,0,0,0
  
  .code
  start:
      lea  EAX, dates     ; create pointer to beginning of dates array
      push EAX
      call datetonum
  
      ;-------------------
      ;put value currently in EAX into array to be sorted
      ;-------------------
      print "Array to be sorted contents: "
      print chr$(13,10)
  
  
      lea ECX, ra
      mov [ECX + nDates], EAX
      print ra
      print chr$(13,10)
  </code></pre>
  
  <p>Here's the <code>datetonum</code> function</p>
  
  <pre><code>;param1 (date string) = address of 12 byte date
  datetonum:
      enter 4, 0                    ; [EBP - 4] holds 4 byte temp variable
      mov  EBX, [EBP + 8]           ; pointer to entire date string
      lea  ESI, [EBX]               ; pointing to day part of date
      lea  EDI, [EBP - 4]           ; pointing to address of local variable to store day string
      mov  ECX, 2
      cld
      rep  movsb
      mov  EDX, 0
      mov  [EDI], EDX               ; add null terminator
  
      lea  EDX, [EBP - 4]
      mov  EAX, sval(EDX)           ; convert day string to int
      push EAX                      ; push EAX to stack
  
  
      ; extract month from date
      lea  ESI, [EBX + 3]           ; pointing to month part of date
      lea  EDI, [EBP - 4]           ; pointing to address of local variable to store month string
      mov  ECX, 3
      cld
      rep  movsb
      mov  EDX, 0
      mov  [EDI], EDX               ; add null terminator
  
  
  
      ; debug print of month string
      pushad
      lea  EDX, [EBP - 4]
      print EDX
      print chr$(9)                 ; print a tab character
      print chr$(13,10)
      popad
  
      ; find month number
      sub ESI, ESI
      lea EDX, [EBP - 4]
      mov EAX, [EDX]
      mov ECX, 12
  search_top:
      lea EDX, [months + ESI * 4]
      mov EBX, [EDX]
      inc ESI
      cmp EAX, EBX
      loopne search_top
  
      mov EDX, ESI                    ; result is in ESI
  
      pop EAX                         ; pop EAX off the stack
      mov AH, DL                      ; copy the month int into AH
      push EAX                        ; push EAX to stack
  
      ; convert year chars to 2 byte int
      mov EBX, [EBP + 8]
      lea ESI, [EBX + 7]              ; pointing to year part of date
      lea EDI, [EBP - 4]              ; pointing to address of local variable to store year string
      mov ECX, 4
      cld
      rep movsb
      mov EDX, 0
      mov [EDI], EDX                  ; add null terminator
  
      lea EDX, [EBP - 4]
      mov EDX, sval(EDX)              ; convert year string to int
  
      pop EAX                         ; pop EAX off the stack
      mov EBX, EAX                    ; copy EAX (contains month in AH and day in AL) to EBX
      mov EAX, EDX                    ; copy year to EAX
      shl EAX, 16                     ; shift the year over to high 16 bits in EAX
      mov AX, BX                      ; copy the month and day into low 16 bits in EAX
  
      ;print EAX ; this crashes the proc
      print str$(EAX)
      print chr$(13,10)
  
      leave
      ret 4
      exit
  </code></pre>