((
  ;; assign an array from 1 to 99
  ;; sum and print all of those numbers
  (edi <- 5) ;; index at 1
  (eax <- (allocate 199 3))
  (esi <- eax) ;; array base pointer
  (ecx <- eax) ;; current position poitner
  (ecx += 4) ;; first value is the number of element
  
  ;; save ecx
  (esp += -4)
  ((mem esp 0) <- ecx)
  
  ;; print
  (eax <- (print esi))
  
  :assign
  
  ;; restore ecx after print
  (ecx <- (mem esp 0))
  (ecx += 4)
  ((mem esp 0) <- ecx)
  
  (cjump edi <= 199 :begin0 :end0)
  ;; array grows upwards(towards higher memory)
  ;; stack grows downwards(towards lower memory)
  ;; that's why we decrement esp, but increment edi as an array pointer
  :begin0
  (ebx <- (mem ecx 0))
  (edx <- (mem ecx -4))
  ;;(eax <- (print edx))
  (ebx += edx)
  (ebx -= 1)
  ((mem ecx 0) <- ebx)
  (edi += 2)
  (goto :assign)
  :end0
  
  (eax <- (print esi))
  ;; restore esp
  (esp += 4)
  ))
  
