64Bit inline Assembler



  • Hallo,

    Was mache ich falsch?
    Ich will per inline Assembler unter c++, zwei 64Bit Zahlen mit einander addieren:

    int main()
    {
    	unsigned long long Z1 = 100000000000;
    	unsigned long long Z2 = 5;
    	asm volatile("add %0,%1;" : "+r"(Z1) : "r"(Z2) : "memory");
    
        return 0;
    }
    

    Ich bekomme aber immer unterschiedliche ergebnisse raus.

    Wenn ich mir jetzt den Assembler Code anschaue, lädt er die 2. Zahl mit dem 32Bit Register edx anstelle des 64Bit Registers rdx. Dadurch wird der obere Teil von rdx nicht auf 0 gesetzt.

    movabs	rax, 100000000000
    	mov	edx, 5
    	add rax,rdx;
    

    ich benutze den GCC

    gcc  Test.cpp -masm=intel  -O3 -o Test.asm -S
    

    Was mache ich nur falsch?



  • Falk_1 schrieb:

    Dadurch wird der obere Teil von rdx nicht auf 0 gesetzt.

    Doch, genau das sollte der Fall sein. Im Intel Manual 1 Kapitel 3.4.1.1 steht das 32 Bit Operationen mit zero extend in die 64 Bit Register geschrieben werden.

    Wie siehst du denn das es falsch ist?



  • Falk_1 schrieb:

    Hallo,

    Was mache ich falsch?
    Ich will per inline Assembler unter c++, zwei 64Bit Zahlen mit einander addieren:

    int main()
    {
    	unsigned long long Z1 = 100000000000;
    	unsigned long long Z2 = 5;
    	asm volatile("add %0,%1;" : "+r"(Z1) : "r"(Z2) : "memory");
    
        return 0;
    }
    

    Ich bekomme aber immer unterschiedliche ergebnisse raus.

    Bei mir klappts. cout<<Z1<<'\n'; ergibt 100000000005.

    Falk_1 schrieb:

    ich benutze den GCC

    gcc  Test.cpp -masm=intel  -O3 -o Test.asm -S
    

    Sicher? Kann es sein, daß Du auch mal -masm=intel vergessen hast?



  • Vielen Dank für die Info

    Tobiking2 schrieb:

    Im Intel Manual 1 Kapitel 3.4.1.1 steht das 32 Bit Operationen mit zero extend in die 64 Bit Register geschrieben werden.

    Ich habe es ausprobiert und es werden wirklich die restlichen Bits auf 0 gesetzt.

    Das Problem lag an einer anderen Stelle im Code. Ich hatte einen großen Schock bekommen, weil der Compiler das 32 Bit Register benutzt hate und nicht weiter nach Fehlern gesucht. Zwecks Übersichtlichkeit habe ich nur eine kleine Version des Problems veröffentlicht, damit es auch jeder nachvollziehen kann.

    Nochmal vielen Dank für die Schnelle Hilfe.


Anmelden zum Antworten