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);
}