[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