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

Xinho

PRECISO DE AJUDA URGENTEEEEEEEEEE

7 mensagens neste tópico

OBJECTIVO: http://www.ncc.up.pt/~rprior/0607/AC/trab1.html

#include <stdio.h>
extern int Apoo_code[];
extern int Apoo_data[];
extern int Apoo_code_size;
extern int Apoo_data_size;

int arg1(int pos){
  int arg01;
  arg01=((Apoo_code[pos] & 0x000f0000)>>16);  // Usa o & para selecionar somente o arg1 no codigo hex, o >> 16 serve para retirar os 4 zeros a direita 1hex=4bits
  return arg01;
}
int arg0(int pos){
  int arg00;
  arg00=((Apoo_code[pos] & 0x00000f00)>> 8);  // Usa o & para seleccionar somente o arg0 no codigo hex, o >> 8 serve para retirar os 2 zeros a direita 1hex=4bits
  return arg00;
}
int opcode(int pos){
  int op;
  op=(Apoo_code[pos] & 0x000000ff); //Usa somente o & para seleccionar os 8 bits desejado como não há zeros a direita não necessita de nenhum shift
  return op;
}
int word(int pos){
  int word1;
  word1=(Apoo_code[pos+1] & 0xffffffff);  //Usa somente o & para seleccionar os 32 bits desejado como não há zeros a direita não necessita de nenhum shift
  return word1;
}
int *copy(int mem[]){
  int size=0;
  while(Apoo_data_size>size){
    mem[size]=Apoo_data[size];  //copia do vector Apoo data para o vector mem
    size++;
  }
  return mem;
}
void apoo_run(){
  int reg[32], mem[32], pilha[32], pos=0, pipos=0; //pos = as posições q serão tomadas quando percorre pelo Apoo code, pips um contador para saber em q posição se encontra a pilha
  copy(mem);
  while(pos<Apoo_code_size && opcode(pos)!=0){  
    switch(opcode(pos))
      {
      case 0 : break; //halt ?! ?! 
      case 1 : reg[arg0(pos)]=mem[word(pos)];
pos=pos+2;                              //load Guarda do reg[x] o valor encontrado na memoria atraves do endereço dado pela word0
break;	
      case 2 : reg[arg0(pos)]=word(pos);
pos=pos+2;                             //loadn o favorito de mtus guarda num reg[x] o valor dado diretamente(word 1)  
break;

      case 3 : reg[arg0(pos)]=mem[arg1(pos)];  
pos++;                                  //não lembro como se faz loadi, mas deve ser algo assim xD tenho sono sao 4:45am.
break;

      case 4 : mem[word(pos)]=reg[arg0(pos)];
pos=pos+2;                             //store passa o valor do reg[x] para a mem[x]
break;

      case 5 : reg[arg1(pos)]=reg[arg0(pos)];
        printf("%d %d\n",reg[arg1(pos)],reg[arg0(pos)]);
pos++;                                 //storer copia o valor contido num reg[x] para um reg[y]
break;
      case 6 : mem[arg1(pos)]=reg[arg0(pos)];
pos++;                                 //storei 
break;
      case 7  : reg[arg1(pos)]=reg[arg0(pos)]+reg[arg1(pos)]; // Soma Rj+Ri é guarda o resultado em Ri
pos++;
break;
      case 8  : reg[arg1(pos)]=reg[arg0(pos)]-reg[arg1(pos)]; // Subtração Rj-Ri e guarda o resultado em Ri
pos++;
break;
      case 9  : reg[arg1(pos)]=reg[arg0(pos)]*reg[arg1(pos)]; // Multiplicação Rj*Ri e guarda o resultado em Ri
pos++;
break;
      case 10 : reg[arg1(pos)]=reg[arg0(pos)]/reg[arg1(pos)]; // Divisão Inteira Rj/Ri e guarda o resultado em Ri
pos++;
break;
      case 11 : reg[arg1(pos)]=reg[arg0(pos)]%reg[arg1(pos)]; //Resto da divisão Rj%Ri e guarda o resultado em Ri
pos++;
break;
      case 12 : reg[arg0(pos)]=0; //Zero coloca no Ri o valor 0
pos++;
break;
      case 13 : reg[arg0(pos)]++; //incrementa um valor ao Ri
pos++;
break;	
      case 14 : reg[arg0(pos)]--; //Decrementa um valor ao Ri
pos++;
break;	
      case 15 : pos=word(pos); // JUMP altera o inteiro pos para o valor encontrado na word1 ou seja redireciona o pos para o valor da word1
break;	
      case 16 : if(reg[arg0(pos)]!=0){
pos=word(pos);                  // JNZERO verifica se o valor de Ri é diferente de 0 caso seje coloca o inteiro pos=a word1 caso nao avança para o proximo comando
break;
      }
pos=pos+2;
break;	
      case 17 : if(reg[arg0(pos)]==0){
pos=word(pos);
break;                          // JZERO verifica se o valor de Ri é = a 0 caso seje coloca o inteiro pos = a word1 caso nao avança para o proximo comando
      }
pos=pos+2;
break;	
      case 18 : if(reg[arg0(pos)]>0){
	pos=word(pos);
break;                          // JPOS verifica se o valor de Ri é > q 0 caso seje coloca o inteiro pos = a word1 caso nao avança para o proximo comando
      }
pos=pos+2;
break;	
      case 19 :  if(reg[arg0(pos)]<0){
  	pos=word(pos);
break;                          // JNEG verifica se o valor de Ri é < q 0 caso seje coloca o inteiro pos = a word1 caso nao avança para o proximo comando
      }
pos=pos+2;
break;

      case 20 : pilha[pipos]=pos+1;
pos=word(pos);               // JSR VERIFICAR COM ALGUEM copia para o vector pilha a posição encontrada mais uma unidade coloca Word1 como valor de pos
pipos++;
break;

      case 21 : pos=pilha[pipos-1];
pipos--;
break;                       // RTN VERIFICAR COM ALGUEM Copia para o pos o ultimo valor da pilha valido 		
      case 22 : pilha[pipos]=reg[arg0(pos)];
pos++;                                //PUSH coloca o valor de Ri no topo da pilha
pipos++;
break;	
      case 23 : reg[arg0(pos)]=pilha[pipos-1];
pos++;                                  //POP coloca o valor do topo da pilha para o Ri
pipos--;
break;     
      default : printf("fiz alguma coisa mal por ai...\n");
      break;
      }
  }
}

O QUE ESTÁ MAL?? o prog. ate me da erro! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Escuta, tu não vens aqui ao fórum pedir ajuda para um trbalho que és tu que tens de fazer e esperar que com um título desses vais atrair muita gente e vão fazer o trabalho por ti! Se o prog dá-te erro descobre qual é, posta o erro, pede ajuda como deve ser, não com titulos desses. E não esperes que postando o codigo inteiro aqui vai haver alguém que automátricamente vai te fazer tirar um 20.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se alguém conseguir descobrir erros em vez de mandar bocas desnecessárias.. agradecia!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Embora a "boca desnecessária" tenha sido um bocado ríspida, não deixa de ser verdadeira, e é mesmo necessária, ainda para mais com a resposta que deste a seguir.

É suposto adivinharmos qual é o erro que dá, e onde? Se tu não te dás ao trabalho de especificar, achas que alguém se vai dar ao trabalho de tentar compilar o código para descobrir?

E essa atitude... Ninguém está aqui por obrigação. Se tentamos ajudar quando aparece alguém com dúvidas, é por boa vontade. E a boa vontade esgota-se facilmente quando não há respeito.

Se disseres exactamente quais são os problemas que estás a ter, talvez consigas ajuda...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tão rapaz..tem calma...é obvio que ninguem te vai fazer o trabalho

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal, acho que ele já compreendeu. Evitem flames, sff.

Já agora, Xinho de futuro começa a colocar titulos mais objectivos nas threads, acredita que é meio caminho andado para uma boa ajuda.

abraços, HecKel

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