Variable Parameteranzahl



  • Moin,

    hab da ein problem...
    ich möchte eine C-Funktion aufrufen, aber mal mit 2 long parametern - mal mit 3 long parametern - und mal mit X long parametern.

    also möchte ich die Anzahl der Parameter aus einer C-Variable in den ASM-Code übergeben. und auch die Adresse der Funktion soll übergeben werden.

    ich denke, dass ich in asm eine schleife brauche um das zu realisieren!?

    so stell ich mir das vor:

    c++{
      long pAnz = 3; // Anzahl der Parameter
      void* funcPtr = 0x12345678; // Adresse der Funktion
      void* params = 0x5234234; // Irgend ein Zeiger auf speicher
    
      asm{
        mov %pAnz, %cnt;   // anzahl der parameter merken
        loop:              // sprung marke 
        pushl %params;     // den ersten parameter auf den stack
        addl $4, %params;  // zeiger erhoehen
        decl %cnt;         // counter dekrementieren 
        jnz loop;          // springen wenn nicht null
        call %funcPtr;     // funktion aufrufen
      }
    }
    

    ist natürlich nur ausgedachter code... weil ich kein plan hab wie ich das in ASM realisiere.

    ist das prinzipiell möglich?



  • könnte so aussehen - muss halt noch vom Intel- Syntax in den frickligen AT&T- Syntax übersetzen:

    unsigned long vararg__cdecl(unsigned long nArgs,void* pArgs,void* pFunc)
    {
    unsigned long result;
    	__asm{
    		mov ecx,nArgs
    		mov edx,pArgs
    		mov eax,pFunc
    		test ecx,ecx
    		jmp l2
    	l1: push DWORD ptr [edx+ecx*4-4]
    		sub ecx,1
    	l2:	jnz l1
    		call eax
    		mov ecx,nArgs
    		lea ecx,[ecx*4]
    		add esp,ecx
    		mov result,eax
    	}
    	return result;
    }
    
    int main()
    {
    	DWORD args[4] = {(DWORD)"hello: %d % d % d\n",3,4,5};
    
    	printf("bla bla\n");
    
    	vararg__cdecl(4,&args[0],&printf);
    
    	system("pause");
    	return 0;
    }
    


  • wow - vielen dank. dann versuch ich mich am frickligen at&t 👍


Anmelden zum Antworten