<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Inline Assembler(VC++): Rückgabe von Objekt]]></title><description><![CDATA[<p>ich brauche in einer assembler-funktion einen std::string. dazu lasse ich mir von new einen string erzeugen. der zeiger liegt dann in eax. soweit funzt alles.</p>
<p>am ende der asm-funktion muss ich allerdings einen std::string zurückgeben. schreibe ich die funktion um und gebe einen zeiger zurück in eax, funktioniert alles.<br />
sobald ich allerdings ein richtiges std::string objekt zurückgeben möchte, crasht das programm. das std::string objekt beim vc++ ist 32bit groß, weshalb ich dachte, dass man einfach den std::string in ein register schreibt. das geht allerdings nicht.</p>
<pre><code class="language-asm">call    get_std_string_object   ; wrappt nur new
    ; std::string* in eax
    ; wollte ich einen string* zurückgeben, würde ich jetzt zurückkehren
    ; alles würde funktionieren

    mov     eax, [eax]    ; &quot;zeiger dereferenzieren&quot;
    ; jetzt crasht das programm
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/153702/inline-assembler-vc-rückgabe-von-objekt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 07:27:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153702.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Jul 2006 20:57:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Inline Assembler(VC++): Rückgabe von Objekt on Wed, 19 Jul 2006 20:57:49 GMT]]></title><description><![CDATA[<p>ich brauche in einer assembler-funktion einen std::string. dazu lasse ich mir von new einen string erzeugen. der zeiger liegt dann in eax. soweit funzt alles.</p>
<p>am ende der asm-funktion muss ich allerdings einen std::string zurückgeben. schreibe ich die funktion um und gebe einen zeiger zurück in eax, funktioniert alles.<br />
sobald ich allerdings ein richtiges std::string objekt zurückgeben möchte, crasht das programm. das std::string objekt beim vc++ ist 32bit groß, weshalb ich dachte, dass man einfach den std::string in ein register schreibt. das geht allerdings nicht.</p>
<pre><code class="language-asm">call    get_std_string_object   ; wrappt nur new
    ; std::string* in eax
    ; wollte ich einen string* zurückgeben, würde ich jetzt zurückkehren
    ; alles würde funktionieren

    mov     eax, [eax]    ; &quot;zeiger dereferenzieren&quot;
    ; jetzt crasht das programm
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1100649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1100649</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Wed, 19 Jul 2006 20:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Assembler(VC++): Rückgabe von Objekt on Thu, 20 Jul 2006 10:20:35 GMT]]></title><description><![CDATA[<p>terraner schrieb:</p>
<blockquote>
<p>das std::string objekt beim vc++ ist 32bit groß</p>
</blockquote>
<p>Verzeih mir meine Skepsis, aber das halte ich für ein Gerücht. Datenzeiger, Gesamtlänge des Speichers, aktuelle Länge des Strings? Da würde ich eher mal auf mindestens 96 Bit tippen.</p>
<p>Ansonsten ist das keine gute Idee, was du da vorhast. Die genaue Implementation von std::string ist nunmal nicht festgelegt. Ich würde einfach nur den Zeiger zurückgeben. Ansonsten kannst du dir auch mal eine entsprechende C++ Quelle erstellen und das Assembler Listing anschauen. Empfehlen wurde ich trotzdem nicht, das Objekt by-value mittels Assembler zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1100952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1100952</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 20 Jul 2006 10:20:35 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Assembler(VC++): Rückgabe von Objekt on Thu, 20 Jul 2006 23:14:02 GMT]]></title><description><![CDATA[<p>Fürs kopieren gibt es den Copyconstructor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Am besten schaust du dir mal an, wie der Compiler das macht. Aber vermutlich macht es wenig Sinn, den Teil selbst zu implementieren (denk dran, dass der Compiler hier mehr optimieren kann, durch inlinen oä)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101526</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 20 Jul 2006 23:14:02 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Assembler(VC++): Rückgabe von Objekt on Mon, 24 Jul 2006 15:49:25 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Verzeih mir meine Skepsis, aber das halte ich für ein Gerücht. Datenzeiger, Gesamtlänge des Speichers, aktuelle Länge des Strings? Da würde ich eher mal auf mindestens 96 Bit tippen.</p>
</blockquote>
<p>pImpl denke ich mal. ich habe das mit sizeof(std::string) rausgefunden wen es interessiert.</p>
<blockquote>
<p>Ansonsten ist das keine gute Idee, was du da vorhast. Die genaue Implementation von std::string ist nunmal nicht festgelegt. Ich würde einfach nur den Zeiger zurückgeben. Ansonsten kannst du dir auch mal eine entsprechende C++ Quelle erstellen und das Assembler Listing anschauen. Empfehlen wurde ich trotzdem nicht, das Objekt by-value mittels Assembler zurückzugeben.</p>
</blockquote>
<blockquote>
<p>Fürs kopieren gibt es den Copyconstructor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>ach genau. dann muss ich das ganze eben mit c machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103283</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Mon, 24 Jul 2006 15:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Assembler(VC++): Rückgabe von Objekt on Wed, 26 Jul 2006 16:02:00 GMT]]></title><description><![CDATA[<p>der vc++ benutzt bei einer funktion folgenden formates</p>
<p>retVal function_name(arg1, arg2, ...)</p>
<p>named return value optimization, sodass die funktion für assembler-programmierer eigentlich so aussieht:</p>
<p>xxx function_name(retVal&amp;, arg1, arg2, ...)</p>
<p>das neue problem ist jetzt, dass irgendwann der copy-ctor aufgerufen wird.</p>
<p>bei aufruf des copy-constructors wird this in ecx übergeben und das zurückzugebende objekt auf den stack gepusht.</p>
<p>Beispiel (VC++ Disassembly):</p>
<pre><code class="language-asm">Foo a;
004113BE  lea         ecx,[a] 
004113C1  call        Foo::Foo (4110C3h) 
	Foo b(a);
004113C6  lea         eax,[a] 
004113C9  push        eax  
004113CA  lea         ecx,[b] 
004113CD  call        Foo::Foo (411181h)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1104720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104720</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Wed, 26 Jul 2006 16:02:00 GMT</pubDate></item><item><title><![CDATA[Reply to Inline Assembler(VC++): Rückgabe von Objekt on Wed, 26 Jul 2006 16:14:37 GMT]]></title><description><![CDATA[<p>anscheinend gibt es keine möglichkeit einen ctor aufzurufen. funktionszeiger, adressen... sind verboten.<br />
(&quot;'Initialisierung': 'Foo *__w64 ' kann nicht in 'beliebiger_typ' konvertiert werden<br />
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist&quot;)</p>
<p>&quot;An __asm block can call only global C++ functions that are not overloaded. If you call an overloaded global C++ function or a C++ member function, the compiler issues an error.&quot;</p>
<p>da bleibt nur eins (außer hardcodieren der adresse?):</p>
<pre><code class="language-cpp">&lt;size_t N&gt;
struct bitset
{
    std::string* to_string_impl() const;
    std::string to_string() const { return *to_string_impl(); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1104753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104753</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Wed, 26 Jul 2006 16:14:37 GMT</pubDate></item></channel></rss>