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, ¶metro);
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!!!