Präproprezessor in C

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Präproprezessor in C
Hallo zusammen !
ich muss eine Virtuale Machine programmieren, die einen Stack hat und ein Programmspeicher.Und der Stack soll ganz normal funktionnieren.Ich kann im Stack auch negativen Wert speichern…ich habe hier eine definition von Präprozessoren, die ich hier nicht versteht,ich muss damit arbeiten. Kann jemand mich helfen. und mir erklären was wird gemacht. Danke

#define SIGN_EXTEND(i) ((i) &0X008000000 ? (i) | 0XFF000000 :(i))

Danke

Beste Grüße


Ich würde einfach mal sagen, wenn i bitweise mit 0X008000000 verundet true ergibt, dann gebe i biteweise verodert mit 0XFF000000 zurück, ansonsten i.


Das scheint ein Sign-Extend zu sein, allerdings ist mir nicht ganz klar, warum das [m]0x08000000[/m] und nicht [m]0x00800000[/m] ist.

0X08000000 = 0b00001000 00000000 00000000 00000000
0XFF000000 = 0b11111111 00000000 00000000 00000000

0x00800000 = 0b00000000 10000000 00000000 00000000

danke


noch eine Frage, was bedeutet
ISO C90 forbids mixed declarations and code [-Wpedantic]
warning: ISO C forbids nested functions [-Wpedantic]


eins und zwei


verstehe ich nicht, ich habe diese code generiert

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define HALT                    0

#define PUSHC                   1
#define ADD                     2
#define SUB                     3
#define MUL                     4
#define DIV                     5
#define MOD                     6

#define RDINT                   7
#define WRINT                   8
#define RDCHR                   9
#define WRCHR                   10

#define IMMEDIATE(x) ((x) & 0x00FFFFFF) 
#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i)) 

void pushc(int);
int pop(void);
int add(void);
int sub(void);
int mul(void);
int division(void);




int sp=0; 
int pc;
int stack[100];
int programmspeicher[100];
int i=0;
unsigned int code1[] = {
(PUSHC << 24) | IMMEDIATE(3),
(PUSHC << 24) | IMMEDIATE(4),
(ADD << 24), 
(PUSHC << 24) | IMMEDIATE(10),
(PUSHC << 24) | IMMEDIATE(6),
(SUB << 24),
(MUL << 24),
(WRINT << 24),
(PUSHC << 24)| IMMEDIATE(10),
(WRCHR << 24),
(HALT << 24)
};

unsigned int code2[] = {
(PUSHC << 24) | IMMEDIATE(-2),
(RDINT << 24),
(MUL << 24),
(PUSHC << 24) | IMMEDIATE(3),
(ADD << 24), 
(WRINT << 24),
(PUSHC << 24) | IMMEDIATE('\n'),
(WRCHR << 24),
(HALT << 24)
};

unsigned int code3[] = {
(WRCHR << 24),
(WRINT << 24),
(PUSHC << 24) | IMMEDIATE('\n'),
(WRCHR << 24),
(HALT << 24)
};
int pop(){
  if(sp<0){
    printf("stack ist leer,kann nicht entleeren sein ");
    exit(99);
  }else{
    return stack[sp--];
  }
}	
int add(){
  pushc(pop()+pop());
  return 0;
  
}
void pushc(int wert){
  if(sp<100){
     stack[sp++]=wert;
  }
  else{
    printf("stack ist voll kann nicht gepushed sein %d\n",wert);
    exit(1);
  
}
int sub(){
  int op;
  op=pop();
  pushc(op-pop());
  return 0;
}
int mul(){
  /*int op=pop();*/
  pushc(pop()*pop());
  return 0;
  
}
int division(){
  int op;
op=pop();
  if(op==0){
    exit(1);
    printf("op ist ungueltig\n");
  }
  pushc(pop()/op);
  return 0;
}
/**void halt(){}
void wrchr(){}
void wrint(){}
void rdint(){}
void rdchr(){}*/

void listen(unsigned code[]){
  int i=0;
  int wert;
  unsigned int shift_code=code[i]>>24;
  while(1){
    switch (shift_code){
      case '1':
	pushc(IMMEDIATE(x));
	printf("%x pushc %s \n",i,IMMEDIATE(x));
	break;
      case '2':
	add();
	printf("%x add \n",i);
	break;
    
      case '3':
	sub();
	printf("%x sub \n",i);
	break;
      
      case '4':
	  mul();
	  printf("%x mul \n",i);
	  break;
	  
     default:
	division();
	printf("%x div \n",i);
	break;
    }
    i++;
      
  }
}
void ausfuehren(unsigned code[]){
  
}


int main (int argc, char * argv[]){
  if(argc==1){
    printf("Ninja Virtual Machine started\n");													
    printf("Ninja Virtual Machine stopped\n");	
  }
  else if(argc==2){
      if((strcmp(argv[1],"--version")==0)){
	printf("Ninja Virtual Machine version 0 (compiled Oct 20 2013, 11:00:39)\n");
     }	
     else if (strcmp(argv[1],"--help")==0){
        printf("usage: ./njvm [option] [option] ...\n");
        printf(" --version        show version and exit\n");	
        printf(" --help           show this help and exit\n");
     }
     else if(strcmp(argv[1],"--prog1")==0){
       listen(code1);
        }
     else if(strcmp(argv[1],"--prog2")==0){
       listen(code2);
        }
     else if(strcmp(argv[1],"--prog3")==0){
       listen(code3);
      }else{
       printf("unknown command line argument '%s', try './njvm --help'\n", argv[2]);
      }
  }else{
    printf("unknown command line argument '%s', try './njvm --help'\n", argv[3]);
  }
  return 0;
  
  
}



und bekomme diese fehler, dass ich schon lange versucht zu loesen, bei der funktion , “sub”, “division” und “mul”

hier sind die fahler:

gcc -m32 -g -Wall -ansi -pedantic -o njvm njvm.c
njvm.c: In function ‘pushc’:
njvm.c:93:1: warning: ISO C forbids nested functions [-Wpedantic]
int sub(){
^
njvm.c:93:1: warning: ISO C90 forbids mixed declarations and code [-Wpedantic]
njvm.c:99:1: warning: ISO C forbids nested functions [-Wpedantic]
int mul(){
^
njvm.c:105:1: warning: ISO C forbids nested functions [-Wpedantic]
int division(){
^
njvm.c:121:1: warning: ISO C forbids nested functions [-Wpedantic]
void listen(unsigned code[]){
^
njvm.c: In function ‘listen’:
njvm.c:128:18: error: ‘x’ undeclared (first use in this function)
pushc(IMMEDIATE(x));
^
njvm.c:19:24: note: in definition of macro ‘IMMEDIATE’
#define IMMEDIATE(x) ((x) & 0x00FFFFFF)
^
njvm.c:128:18: note: each undeclared identifier is reported only once for each function it appears in
pushc(IMMEDIATE(x));
^
njvm.c:19:24: note: in definition of macro ‘IMMEDIATE’
#define IMMEDIATE(x) ((x) & 0x00FFFFFF)
^
njvm.c:123:7: warning: unused variable ‘wert’ [-Wunused-variable]
int wert;
^
njvm.c: In function ‘pushc’:
njvm.c:155:1: warning: ISO C forbids nested functions [-Wpedantic]
void ausfuehren(unsigned code[]){
^
njvm.c:160:1: warning: ISO C forbids nested functions [-Wpedantic]
int main (int argc, char * argv[]){
^
njvm.c:160:5: warning: ‘main’ is normally a non-static function [-Wmain]
int main (int argc, char * argv[]){
^
njvm.c:191:1: error: expected declaration or statement at end of input
}
^
make: *** [njvm] Fehler 1


bessere Erklaerung, muss ich ein Virtual Machine bauen, die ein Stack hast und auch eine Programmspeicher, ich bin noch nicht fertig , und es ist klar auch, dass bei der funktion listen gibt es fehler, ich habe es noch nicht korrigiert.Aber wenn jemand Ahnnung wie ich diese ISO fehler und nested loesen kann. Danke
Liebe Gruesse
dng


Dir fehlen Klammern… :rolleyes:


Danke, stimmt es fehlt klammar.
jetzt, es is ganz klar. geloest
Gruss