Simpletron

1. Simpletron

Leonardo Bonacini
LeoBonacini

(usa Ubuntu)

Enviado em 15/11/2013 - 19:41h

Olá Pessoal, Boa Noite,

Tenho um trabalho a fazer, porém etou com dificuldade. Tenho que fazer a máquina Simpletron somente em C.
Fiz o programa, mas está ocorrendo algum erro o acumulador não recebe a variavel quando eu a digito-a. Voês conseguiriam me ajudar a resolver este código? Até o momento meu código está assim.

#include<stdio.h>

#define READ 10
#define WRITE 11
#define LOAD 20
#define STORE 21
#define ADD 30
#define SUBTRACT 31
#define DIVIDE 32
#define MULTIPLY 33
#define BRANCH 40
#define BRANCHNEG 41
#define BRANCHZERO 42
#define HALT 43
#define LIMITE 100

void boas_vindas ();

void zerar_memoria (long int *);

void programa (long int *);

void processamento (long int *);

void read (long int *, int);

void write (long int *, int );

void load (long int *, int , int *);

void store (long int *, int posicao, int *);

void add (long int *, int , int *);

void subtract (long int *, int , int *);

void divide (long int *, int , int *);

void multiply (long int *, int , int *);

void branch (int *, int );

void branchneg (int, int *, int);

void branchzero (int, int *, int);

void halt (int *, int *, int *);

void ERROR (long int *, int *);

void dump_function (int, int);

int main(int argc, char *argv[])
{
long int MEMORIA[LIMITE];

boas_vindas (); // Boas - Vindas

zerar_memoria (MEMORIA); // Zerar o Espaço de Memória

programa (MEMORIA); // Digitar o código do programa

processamento (MEMORIA); // Rodar Programa

return 0;
}

void boas_vindas ()
{
printf ("***** Bem - Vindo ao Simpletron *****\n"
"***** Assim que o nosso programa carregar *****\n"
"***** digite seu programa ou entre com seu *****\n"
"***** arquivo de daods tecle -99999 para encerrar *****\n"
"***** seu programa *****\n");
}

void zerar_memoria (long int *MEMORIA)
{
int i;

for (i = 0; i < LIMITE; i++)
{
MEMORIA[i] = 0;
}
printf ("- A memória está pronta para ser executada\n");
}

void programa (long int *MEMORIA)
{
int i = 0;
long int a = 0;

printf ("Obs.: Memória máxima 100\n");

do
{
printf ("Digite seu código: ");
scanf ("%li", &a);

MEMORIA[i] = a;
i++;

} while (a != -99999 && i <= 99);

printf ("\n- Os comandos estão carregados\n");
printf ("- A execução será iniciada\n\n");
}

void processamento (long int *MEMORIA)
{
int ACC = 0, IP = 0, codigo = 0, parametro = 0, i = 0;

MEMORIA[99] = ACC;

do
{
ACC = MEMORIA[IP];
codigo = ACC / 100;
parametro = ACC % 100;
switch (codigo)
{
case READ:
read (MEMORIA, parametro);
break;

case WRITE:
write (MEMORIA, parametro);
break;

case LOAD:
load (MEMORIA, parametro, &ACC);
break;

case STORE:
store (MEMORIA, parametro, &ACC);
break;

case ADD:
add (MEMORIA, parametro, &ACC);
break;

case SUBTRACT:
subtract (MEMORIA, parametro, &ACC);
break;

case DIVIDE:
divide (MEMORIA, parametro, &ACC);
break;

case MULTIPLY:
multiply (MEMORIA, parametro, &ACC);
break;

case BRANCH:
branch (&IP, parametro);
break;

case BRANCHNEG:
branchneg (ACC, &IP, parametro);
break;

case BRANCHZERO:
branchzero (ACC, &IP, parametro);
break;

case HALT:
halt (&ACC, &IP, &parametro);
break;

default:
printf ("ERROR: Código inválido\n");
ERROR(MEMORIA, &IP);
break;
}

IP++;

}while (MEMORIA[IP] != -99999 && IP <= 99);

printf ("\nTerminou a execução do seu programa\n\n");

do
{
ACC = MEMORIA[i];
dump_function(ACC, i);
i++;
}while (ACC != -99999);
}


void dump_function(int ACC, int i) // Função Dump Function para mostrar alguns valores
{
if (ACC == -99999)
{
printf ("Fim da Dump function");
}

else
{
printf("Valor do Registrador: %i\n"
"Código da Operação: %i\n"
"Código do Operando: %i\n"
"Endereço da Memória: %i\n\n", ACC, (ACC/100), (ACC % 100), i);
}

}

void read (long int *MEMORIA, int posicao)
{
printf("\nDigite o valor inteiro: ");
scanf ("%li", (MEMORIA + posicao));
}

void write (long int *MEMORIA, int posicao)
{
printf ("\nResultado: %li", *(MEMORIA + posicao));
}

void load (long int *MEMORIA, int posicao, int *ACC)
{
*ACC = MEMORIA[posicao];
}

void store (long int *MEMORIA, int posicao, int *ACC)
{
MEMORIA[posicao] = *ACC;
}

void add (long int *MEMORIA, int posicao, int *ACC)
{
*ACC += MEMORIA[posicao];
}

void subtract (long int *MEMORIA, int posicao, int *ACC)
{
*ACC -= MEMORIA[posicao];
}

void divide (long int *MEMORIA, int posicao, int *ACC)
{
if (MEMORIA[posicao] == 0)
{
printf ("ERROR não existe divisão por zero.");
}
else
{
*ACC /= MEMORIA[posicao];
}
}

void multiply (long int *MEMORIA, int posicao, int *ACC)
{
*ACC *= MEMORIA[posicao];
}

void branch (int *IP, int posicao)
{
*IP = posicao;
}

void branchneg (int ACC, int *IP, int posicao)
{
if (ACC == 0)
{
*IP = posicao;
}
}

void branchzero (int ACC, int *IP, int posicao)
{
if (ACC < 0)
{
*IP = posicao;
}
}

void halt (int *ACC, int *IP, int *posicao)
{
*ACC = 0;
*IP = 99;
*posicao = 0;
}

void ERROR (long int *MEMORIA, int *IP)
{
printf ("Digite o código novamente: ");
scanf("%li", (MEMORIA + *IP));
--(*IP);
}



Desde já agradeço!!!


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts