Anzeige:
Ergebnis 1 bis 3 von 3

Thema: ** operator, Zeiger auf Array

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.03.2006
    Beiträge
    54

    ** operator, Zeiger auf Array

    In einer Funktion wird S4 **pcclist definert das ist:
    long int **pcclist;

    Zugreifen auf die einzelnen Elemente kann ich mit a = pcclist[x][y]

    Jetzt möchte ich einen Zeiger auf pcclist an eine Funktion übergeben.
    Nur wie mache ich das?

    In pcclist sind die Befehle meiner VM gespeichert und das Array möchte ich an den JIT Compiler übergeben. Das Programm stürzt an der Stelle wo es den Opcode ausgeben soll ab.

    Aufruf mit:
    Code:
    jit_compiler (&pcclist, &vmreg, ARG1, ARG2);
    Der JIT Compiler:

    Code:
    #include "global_d.h"
    
    #include <AsmJit.h>
    
    // This is type of function we will generate
    typedef S8 (*MyFn)();
    
    extern "C" void jit_compiler (S4 **clist, struct vmreg *vmreg, S4 start, S4 end)
    {
    	using namespace AsmJit;
    
    // ==========================================================================
    
    	S4 i;
    	S8 r1, r2, r3;
    	S8 r1v, r2v, r3v;
    	
    	printf ("JIT - START\n");
    	printf ("start: %li\n", start);
    	printf ("end: %li\n", end);
    	
    	for (i = start; i <= end; i++)
    	{
    		printf ("opcode: %li\n", clist[i][0]);		/* crash */
    		
    		switch (clist[i][0])
    		{
    			case ADD_L:
    				printf ("ADD_L\n");
    				r1 = clist[i][1]; r2 = clist[i][2]; r3 = clist[i][3];
    				
    				r1v = vmreg->l[r1];
    				r2v = vmreg->l[r2];
    				
    				printf ("r1v: %lli, r1v: %lli\n", r1v, r2v);
    				
    // Create assembler.
    				Assembler a;
    	
    // Log assembler output.
    				FileLogger logger(stderr);
    				a.setLogger(&logger);
    // Prolog.
    				
    				a.push (nbp);
    				a.mov (nbp, nsp);
    				
    				a.mov (rax, r1v); /* r1v */
    				a.mov (rbx, r2v); /* r2v */
    				
    				a.add (rax, rbx);
    				a.mov (nax, rax);
    				
    // Epilog.
    				a.mov (nsp, nbp);
    				a.pop (nbp);
    				a.ret ();
    				
    				MyFn fn = function_cast<MyFn>(a.make());
    				
    				vmreg->l[r3] = fn ();
    				
    				MemoryManager::getGlobal()->free((void*)fn);
    				break;
    		}
    	}
    }
    Wie übergebe ich die Adresse von pcclist richtig?
    "... der Großteil hier hat einfach keine Lust, jede Pore einer Brotscheibe mit Butter auszuschmieren." - Susu

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.604
    Zitat Zitat von jay-t Beitrag anzeigen
    Wie übergebe ich die Adresse von pcclist richtig?
    Warum möchtest du die Adresse von pcclist übergeben? So wie ich das sehe, reicht es doch völlig, wenn du pcclist selber und damit die Adresse des Arrays übergibst:
    Code:
    jit_compiler (pcclist, &vmreg, ARG1, ARG2);

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.03.2006
    Beiträge
    54
    Code:
    extern "C" int jit_compiler (S4 ***clist, struct vmreg *vmreg, S4 start, S4 end)
    {
    Ist richtig. Ich brauche also drei Pointer Angaben vor clist: ***clist.
    Dann geht es.
    "... der Großteil hier hat einfach keine Lust, jede Pore einer Brotscheibe mit Butter auszuschmieren." - Susu

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •