[VS] Nur 32Bit eines 64-Bit-Integers werden an rcx übermittelt



  • Hallo,
    um näher C++ und x64-Assembler kennen zu lernen, möchte ich eine eigene toUpperCase-Funktion schreiben. Dafür habe ich die Speicheradresse des Strings in einen 64-Bit-Integer gecastet. Mittels cout << std::hex << habe ich verifizieren können, dass die Adresse richtig gecastet wurde.
    Nun möchte ich diese der Assembler-Funktion übermitteln.

    #include "stdafx.h"
    #include<iostream>
    #include<conio.h>
    #include<string>
    #include<iomanip>
    
    using namespace std;
    
    extern "C" int _stdcall toUpperCase(__int64 x);
    
    int main()
    {
    	string text = "";
    	cin >> text;     // beliebiger Text
    
    	string* textAdresse = 0L;
    	textAdresse = &text;   // Speicheradresse speichern
    
    	unsigned __int64 q = reinterpret_cast<__int64>(textAdresse);   // Caste Pointer zu Int
    	cout << "text adresse VOR casting: " << textAdresse << endl;  //q und textAdresse sind identisch
    	cout << "text adresse NACH casting: " << std::hex << q << endl; //q und textAdresse sind identisch
    
    	cout << "Adresse aus rax: " << std::hex << toUpperCase(q) << endl;  // q wird an die Assembler Funktion übermittelt. Aber die vorderen 32 Bits sind verloren gegangen, wie man am Output sieht
    
    	system("pause");
        return 0;
    }
    
    .code
    
    toUpperCase proc
    
    mov rax, rcx    ; da die Adresse in rcx ist, wird diese zum Testen in rax kopiert
    
    ret   ; gebe den Wert in rax zurück
    toUpperCase endp
    end
    

    Also denke ich, dass in Zeile 23 Daten verloren gehen



  • extern "C" int _stdcall toUpperCase(__int64 x);
    

    Die Funktion gibt nur ein int zurück.



  • camper schrieb:

    extern "C" int _stdcall toUpperCase(__int64 x);
    

    Die Funktion gibt nur ein int zurück.

    Ohh, dumm von mir.. jetzt sehe ich es auch. Danke 🙂