• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

22vasco22

Interpretador de código máquina Apoo

3 mensagens neste tópico

boas

eu tenho que fazer um trabalho pra faculdade que é fazer um Interpretador de código máquina Apoo em C

o enunciado do trabalho é este: http://www.ncc.up.pt/~rprior/0607/AC/trab1.html

ja fiz o codigo quase todo falta-me apenas as ultimas funçoes

o codigo é o seguinte:

---------------------------------------------------------------------------

#include <stdio.h>

extern int Apoo_code[];
extern int Apoo_data[];
extern int Apoo_code_size;
extern int Apoo_data_size;

static int PC = 0;
// int Apoo_data[] = {};
// int Apoo_data_size = 0;
// int Apoo_code[] = {0x2, 0x0, 0x14, 0x5, 0x0, 0xf, 0xa, 0x104, 0xc350, 0xd, 0x10003, 0x110, 0x7, 0x15};
// int Apoo_code_size = 14;

typedef enum{ HALT, LOAD, LOADN, LOADI, STORE, STORER, STOREI, ADD, SUB, MUL, DIV, MOD, ZERO, INC, DEC, JUMP, JNZERO, JZERO, JPOS, JNEG, JSR, RTN, PUSH, POP} OPERATIONS;




void cmdload( int reg[], int arg0) {
reg[arg0] = Apoo_code[++PC];
PC++;
}



void cmdloadn(int reg[], int arg0){
reg[arg0] = Apoo_code[++PC];
PC++;
}     



void cmdloadi( int reg[], int arg0, int arg1){
reg[arg1] = reg[arg0];
PC++;
}



void cmdstore(int reg[], int arg0){
Apoo_data[Apoo_code[++PC]]=reg[arg0];
Apoo_data_size++;
PC++;
}


void cmdstorer(int reg[], int arg0, int arg1){
Apoo_data[reg[arg1]]=Apoo_data[reg[arg0]];
Apoo_data_size++;
PC++;
}



void cmdstorei(int reg[], int arg0, int arg1){
Apoo_data[reg[arg0]] = reg[arg1];
Apoo_data_size++;
PC++;
}


void cmdadd(int reg[], int arg0, int arg1){
reg[arg1] += reg[arg0];
PC++;
}


void cmdsub(int reg[], int arg0, int arg1){
reg[arg1] = reg[arg0] - reg[arg1];
PC++;
}


void cmdmul(int reg[], int arg0, arg1){
reg[arg1] = reg[arg0] * reg[arg1];
PC++;
}


void cmddiv(int reg[], int arg0, int arg1){
reg[arg1] = reg[arg0] / reg[arg1];
PC++;
}


void cmdmod(int reg[],int arg0, int1){
reg[arg1] = reg[arg0] % reg[arg1];
PC++;
}


void cmdzero(int reg[], int arg0){
reg[arg0] = 0;
PC++;
}


void cmdinc(int reg[], int arg0){
reg[arg0]++;
PC++;
}


void cmddec(int reg[], int arg0){
reg[arg0]--;
PC++;
}


void cmdjump(int reg[]){
PC=Apoo_code[PC];
PC++;
}


void cmdjnzero(int reg[], int arg0){
if(reg[arg0]!=0)
   PC=Apoo_code[PC];
else PC++;
}


void cmdjzero(int reg[], int arg0){
if(reg[arg0]==0)
   PC=Apoo_code[PC];
else PC++;
}


void cmdjpos(int reg[], int arg0){
if(reg[arg0]>0)
   PC=Apoo_code[PC];
else PC++;
}


void cmdjneg(int reg[], int arg0){
if(reg[arg0]<0)
  PC=Apoo_code[PC];
else PC++;
}








int apoo_run(void){

int arg1 = 0, arg0 = 0, word = 0, opcode = 0, aux = 0;

int Reg[32]={0};



while(1) {


     aux    = Apoo_code[PC];   
     opcode = (aux & 0xff);
     aux    = aux >> 8;
     arg0   = (aux & 0xff);
     aux    = aux >> 8;
     arg1   = (aux & 0xff);  


     printf("opcode = 0x%x\n", opcode);
     printf("arg0 = %d\n", arg0);
     printf("arg1 = %d\n", arg1);
     //printf("word = %d\n", word);

   switch ( opcode ) {

   case HALT:
     exit(0);

   case LOAD:
      cmdload( Reg, arg0);
      break;


   case LOADN:
      cmdloadn(Reg, arg0);
      break;

   
   case LOADI:
      cmdloadi(Reg, arg0, arg1);
      break;


    case STORE:
      cmdstore(Reg, arg0);
      break;


    case STORER:
      cmdstorer(Reg,arg0, arg1);
      break;


    case STOREI:
      cmdstorei(Reg, arg0, arg1);
      break;


    case ADD:
      cmdadd(Reg, arg0, arg1);
      break;


    case SUB:
      cmdsub(Reg, arg0, arg1);
      break;


    case MUL:
      cmdmul(Reg, arg0,arg1);
      break;


    case DIV:
      cmddiv(Reg, arg0, arg1);
      break;


    case MOD:
      cmdmod(Reg, arg0,arg1);
      break;


    case ZERO:
      cmdzero(Reg, arg0);
      break;


    case INC:
      cmdinc( Reg, arg0);      
      break;


    case DEC:
      cmddec(Reg, arg0);
      break;
      
      
    case JUMP:
      cmdjump(Reg);
      break;

    
    case JNZERO:
      cmdjnzero(Reg, arg0);
      break;
   

    case JZERO:
      cmdjzero(Reg, arg0);
      break;

    case JPOS:
      cmdjpos(Reg, arg0);
      break;

    case JNEG:
      cmdjneg(Reg, arg0);
      break;
    }
  }
}

---------------------------------------------------------------------------

se alguem me pode-se ajudar a terminar ou encontrar algum erro agradecia

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

APOO meu deus eu tive uma cadeira disso no meu primeiro ano de faculdade :P

Infelizmente já só me lembro do básico acho que não sou grande ajuda :P Em todo o caso boa sorte :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto não está na secção errada?

Pelo menos estou a ver este tópico em Bases de Dados | Dúvidas e Ajudas...

Bem mas a propósito. Eu tou com um medo da cadeira Arquitectura de Computadores e a outra Sistemas Digitais que me pélo!

Nem  é muito o Assembly que me intimída mas sim o Hardware... Aqueles circuitos todos e isso. Tive a ler um bocado daquele livro da IST Press "Arquitectura de Computadores" e não percebi nada! Só esquemas e mais esquemas com circuitos lógicos e afiins... Alguém sabe alguma coisa disto? É que eu queria mesmo ir adiantando umas coisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora