Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Assembler ::  [VS] Nur 32Bit eines 64-Bit-Integers werden an rcx übermittelt     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
KratzKatz
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.09.2016
Beiträge: 25
Beitrag KratzKatz Mitglied 20:02:56 11.06.2017   Titel:   [VS] Nur 32Bit eines 64-Bit-Integers werden an rcx übermittelt            Zitieren

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.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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;
}

Assembler:
1
2
3
4
5
6
7
8
9
.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
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7142
Beitrag camper Moderator 20:34:23 11.06.2017   Titel:   Re: [VS] Nur 32Bit eines 64-Bit-Integers werden an rcx übermittelt            Zitieren

C++:
extern "C" int _stdcall toUpperCase(__int64 x);
Die Funktion gibt nur ein int zurück.
KratzKatz
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.09.2016
Beiträge: 25
Beitrag KratzKatz Mitglied 22:53:05 11.06.2017   Titel:   Re: [VS] Nur 32Bit eines 64-Bit-Integers werden an rcx übermittelt            Zitieren

camper schrieb:
C++:
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 :)
C++ Forum :: Assembler ::  [VS] Nur 32Bit eines 64-Bit-Integers werden an rcx übermittelt   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.