Atividade 4    Resolvendo em assembler o problema do "subvetor de soma máxima"

Um vetor contém inteiros (de 8 bits) que podem ser negativos ou positivos e estão aleatoriamente distribuídos.
Deseja-se encontrar um subvetor de elementos consecutivos cuja soma seja máxima. Embora seja simples encontrar uma solução de tempo cúbico no tamanho do vetor, encontrar uma solução de tempo linear não é trivial. O  algoritmo a seguir em C, é uma solução linear simples e elegante desse problema.

O objetivo desta atividade é traduzir manualmente o algoritmo de C para assembler.
Suponha que o tamanho máximo do vetor é <= 2**16 (isto é, use índices de 16 bits). Teste o seu programa com um vetor de 32 entradas, com valores positivos e negativos aleatoriamente distribuídos, primeiro em C e depois em assembler do 8086. A fim de facilitar a verificação dos resultados em assembler, V. deve converter de binário para ascii-decimal os valores finais start, end e maxsum, utilizando as rotinas de conversão que V. desenvolveu na atividade 3, e mostrá-los no vídeo com uma mensagem semelhante à emitida pelo programa em C.
Para facilitar a geração de números aleatórios de 8 bits com sinal V. pode usar a rotina em C, rand8(),  abaixo, transcrevendo depois os valores gerados pela rotina para o assembler via diretiva : db  val1, val2, ... val32. Nesta rotina a chamada srand()  calcula uma semente distinta para o gerador, de forma que as sequencias geradas serão sempre diferentes, permitindo testar o algoritmo com diversas sequencias. Para demonstrar o programa no laboratório V. deve comentar esta linha e utilizar a sequencia obtida no seu programa em assembler. Desta forma a saída do programa em C poderá ser comparada com a saída do programa em assembler.
Coloque comentários nas  linhas do seu programa em assembler fazendo a correspondencia entre cada linha do programa em C com a(s) linha(s) do programa em assembler. Isto não só  fará uma ótima documentação (pois o algoritmo não é trivial) , como também será muito util na depuração do programa! Para isto não deixe de usar o turbo debugger (td5); ele será indispensável desta vez! V. deve otimizar o tempo de execução do seu programa, colocando em registradores o maior número possível de variáveis.

/* vectmsum.c   Dado um vetor com números positivos e negativos, aleatoriamente distribuidos,
    obter um subvetor de elementos consecutivos cuja soma seja máxima - Out 2001 */

#include <stdlib.h>
#define TMAX 16
#define RANGE 128
void rand8(char tab[], unsigned int size)        /* generate random integers between -RANGE,+RANGE */
{ unsigned int i;
int sum;
  srand(time());                                                 /*comment this line to always get the same sequence */
  printf("\nGenerating %d random signed integers:\n",size);
  for (i=0; i<size; i++){
  sum= rand()%(2*RANGE);
  tab[i]= (sum <RANGE)?sum:RANGE-sum -1;
  printf("%4d",tab[i]);
  }
}
int main()
{
 int i,j,start,end,csum,maxsum;
 char tab[TMAX];
 rand8(tab,TMAX);   /*initialize vector with randomn signed 8 bit integers*/
 csum=maxsum=start=0; end=-1;
 for (i=0, j=0; j < TMAX; j++){
   csum= csum + tab[j];
   if (csum> maxsum){
   maxsum=csum;
   start= i;
   end=j;
   }else if (csum < 0){
 i= j+1;
 csum=0;
    }
 }
 printf("\nsubvector with largest sum:\n start    end    sum\n");
 printf("%6d %6d %6d\n",start,end,maxsum);
}