Inline Assembler hilfe !!!



  • Hi Leute,

    um mein Programm ein bisschen zu beschleunigen habe
    und aus reinem Interesse wollte ich mal Inline-Assembler
    ausprobieren und habe das jetzt folgenden Code stehen der
    irgendwie nicht klappt ^^

    #include "stdafx.h"
    #include <stdio.h>
    
    	struct test
    	{
    		unsigned int test1;
    		unsigned int test2;
    		unsigned int test3;
    	};
    
    unsigned int counter;
    
    struct test array[16384];
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	unsigned int a=1;
    	unsigned int b=0;
    	//int c
    	unsigned int d;
    	unsigned int e=0;
    
    	do
    	{
    		_asm
    		{
    			add a,2h; a+=2?
    			mov d,0h; d=0
    		}
    
    		for(counter = 0; counter < b;counter++)
    		{
    
    			_asm
    			{
    
                                  ;hier kommt das problem ich will das array einlesen
                                  mov eax, array[counter].test1; irgendein blöder fehler
                                  mov edx, counter
                                  mov eax, array[edx].test1; kein fehler beim compilieren aber klappt irgendwie net
    
    			}
    
    		}
    
    	}
    	while (1 == 1);
    
    	return 0;
    }
    

    also wie spreche ich die Arrays im inline-assembler an?

    MfG

    und danke für jede Hilfe

    VB-Veteran



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum Assembler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • wenn du einen zeiger auf dein array hast...

    test *array= new test[500];
    

    ...hast du bereits die adresse des arrays und kannst das einfach in ein register laden und darueber auf die elemente zugreifen:

    mov edi, array  // zeiger auf das erste element des arrays
    mov eax,[edi].test1
    mov ebx,[edi].test2
    add edi, size test  // zeiger zum naechsten element im array schieben
    

    wenn du keinen zeiger hast, sondern lokale daten,

    test array[500];
    

    musst du deren effektive adresse laden

    lea edi, array
    

    und kannst danach genauso darauf zugreifen

    wenn es dir dabei auf performance ankommt, solltest du generell die ganze loop in assembler machen weil der compiler sonst die meiste zeit damit vergeudet, alle register zu sichern und wiederherzustellen, die in einem kleinen assembler-block veraendert werden.


Anmelden zum Antworten