<?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[unerwartetes Runden]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich habe ein kleines Programm schreiben wollen, dass zwei Zahlen addieren/subtrahieren oder was auch immer kann, allerdings auf die &quot;selbstmodifizierende&quot; Art, also das der Programmcode während der Ausführung sich selber verändert:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

using namespace std;

template&lt;typename ReturnValue, typename Arg1, typename Arg2 /* ... */&gt;
ReturnValue execute(vector&lt;char&gt; opcodes, const Arg1&amp; arg1, const Arg2&amp; arg2)
{
	char* exec = (char*)malloc(1);
	for(unsigned int i=0; i&lt;opcodes.size(); ++i)
		exec[i] = opcodes[i];

	return ((ReturnValue(*)(Arg1, Arg2))exec)(arg1, arg2);
}

// Generiert die Opcodes für eine Additionsfunktion. 
vector&lt;char&gt; add() 
{
	vector&lt;char&gt; tmp;

	// fld [esp+4]
	tmp.push_back(0xD9);	// Koprozessor-Escape
	tmp.push_back(0x44);	// Modulo r/m-Byte
	tmp.push_back(0x24);	// SIB
	tmp.push_back(0x04);	// index

	// fadd [esp+8]
	tmp.push_back(0xD8);	// Koprozessor-Escape
	tmp.push_back(0x44);	// Modulo r/m-Byte
	tmp.push_back(0x24);	// SIB
	tmp.push_back(0x08);	// index

	// ret
	tmp.push_back(0xC3);

	return tmp;
}

int main()
{
	cout &lt;&lt; &quot;2.5 + 4.8 = &quot; &lt;&lt; execute&lt;float, float, float&gt;(add(), 2.5, 4.5) &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>Das funktioniert soweit auch recht gut, allerdings ist die Ausgabe 2.5 + 4.5 = 7, ich wollte aber eigentlich 2.5 + 4.8 = 7.3 ausgegeben bekommen.<br />
Wo liegt der Fehler?</p>
<p>Vielen Dank für die Hilfe,</p>
<p>npf.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240092/unerwartetes-runden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 04:50:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240092.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 May 2009 19:01:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 19:01:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich habe ein kleines Programm schreiben wollen, dass zwei Zahlen addieren/subtrahieren oder was auch immer kann, allerdings auf die &quot;selbstmodifizierende&quot; Art, also das der Programmcode während der Ausführung sich selber verändert:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

using namespace std;

template&lt;typename ReturnValue, typename Arg1, typename Arg2 /* ... */&gt;
ReturnValue execute(vector&lt;char&gt; opcodes, const Arg1&amp; arg1, const Arg2&amp; arg2)
{
	char* exec = (char*)malloc(1);
	for(unsigned int i=0; i&lt;opcodes.size(); ++i)
		exec[i] = opcodes[i];

	return ((ReturnValue(*)(Arg1, Arg2))exec)(arg1, arg2);
}

// Generiert die Opcodes für eine Additionsfunktion. 
vector&lt;char&gt; add() 
{
	vector&lt;char&gt; tmp;

	// fld [esp+4]
	tmp.push_back(0xD9);	// Koprozessor-Escape
	tmp.push_back(0x44);	// Modulo r/m-Byte
	tmp.push_back(0x24);	// SIB
	tmp.push_back(0x04);	// index

	// fadd [esp+8]
	tmp.push_back(0xD8);	// Koprozessor-Escape
	tmp.push_back(0x44);	// Modulo r/m-Byte
	tmp.push_back(0x24);	// SIB
	tmp.push_back(0x08);	// index

	// ret
	tmp.push_back(0xC3);

	return tmp;
}

int main()
{
	cout &lt;&lt; &quot;2.5 + 4.8 = &quot; &lt;&lt; execute&lt;float, float, float&gt;(add(), 2.5, 4.5) &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>Das funktioniert soweit auch recht gut, allerdings ist die Ausgabe 2.5 + 4.5 = 7, ich wollte aber eigentlich 2.5 + 4.8 = 7.3 ausgegeben bekommen.<br />
Wo liegt der Fehler?</p>
<p>Vielen Dank für die Hilfe,</p>
<p>npf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704229</guid><dc:creator><![CDATA[npf]]></dc:creator><pubDate>Fri, 01 May 2009 19:01:20 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 19:48:44 GMT]]></title><description><![CDATA[<p>Kann mir wirklich keiner sagen was ich falsch gemacht habe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704242</guid><dc:creator><![CDATA[npf]]></dc:creator><pubDate>Fri, 01 May 2009 19:48:44 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 20:14:53 GMT]]></title><description><![CDATA[<p>Dann schreib es so:</p>
<pre><code class="language-cpp">...    
     cout &lt;&lt; &quot;2.5 + 4.8 = &quot; &lt;&lt; execute&lt;float, float, float&gt;(add(), 2.5, 4.8) &lt;&lt; endl;
...
</code></pre>
<p><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/1704249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704249</guid><dc:creator><![CDATA[otto8]]></dc:creator><pubDate>Fri, 01 May 2009 20:14:53 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 20:19:55 GMT]]></title><description><![CDATA[<p>genau das habe ich gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704250</guid><dc:creator><![CDATA[npf]]></dc:creator><pubDate>Fri, 01 May 2009 20:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 20:34:40 GMT]]></title><description><![CDATA[<p>npf schrieb:</p>
<blockquote>
<p>genau das habe ich gemacht.</p>
</blockquote>
<p>Und wieso steht dann da shier in deinem Quelltext?</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;2.5 + 4.8 = &quot; &lt;&lt; execute&lt;float, float, float&gt;(add(), 2.5, 4.5) &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1704255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704255</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Fri, 01 May 2009 20:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 20:40:01 GMT]]></title><description><![CDATA[<p>Zusätzlich sollte auch der markierten Zeile eine besondere Beachtung zukommen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">template&lt;typename ReturnValue, typename Arg1, typename Arg2 /* ... */&gt;
ReturnValue execute(vector&lt;char&gt; opcodes, const Arg1&amp; arg1, const Arg2&amp; arg2)
{
    char* exec = (char*)malloc(1);  // !!!!!!!!!!!!!!!!!!!!!!!!!
    for(unsigned int i=0; i&lt;opcodes.size(); ++i)
        exec[i] = opcodes[i];

    return ((ReturnValue(*)(Arg1, Arg2))exec)(arg1, arg2);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1704256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704256</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Fri, 01 May 2009 20:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 21:48:46 GMT]]></title><description><![CDATA[<p>So, ich hab jetzt auch erkannt, wo ich mich vertippt hab. Tschuldigung für den blöden Fehler.<br />
Das mit dem malloc(1) geht schon, auch wenns nicht so fein aussieht. Sonst hätte ich mmap unter Linux, VirtualAlloc unter Windows usw. verwenden müssen.</p>
<p>Aber trotzdem Dankeschön!</p>
<p>npf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704281</guid><dc:creator><![CDATA[npf]]></dc:creator><pubDate>Fri, 01 May 2009 21:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 22:01:03 GMT]]></title><description><![CDATA[<p>npf schrieb:</p>
<blockquote>
<p>Das mit dem malloc(1) geht schon, auch wenns nicht so fein aussieht.</p>
</blockquote>
<p>Tschuldige. Mein Fehler. Ich hatte nicht bedacht, dass du sicher irgendwie dafür gesorgt hast, dass hinter exec[0] nichts wichtiges steht und du deshalb garantieren kannst, dass dein Programm nicht absäuft. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Übrigens ist die ganze Kopieraktion sinnlos, weil die Opcodes im Vector ja bereits in der richtigen Reihenfolge vorhanden sind. Statt dem Gefummel mit <strong>exec</strong> würde auch <strong>&amp;opcodes[0]</strong> reichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704285</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Fri, 01 May 2009 22:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Fri, 01 May 2009 22:22:52 GMT]]></title><description><![CDATA[<p>Abgesehen davon, dass der Speicher nicht mehr freigegeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704289</guid><dc:creator><![CDATA[malloc(1)???]]></dc:creator><pubDate>Fri, 01 May 2009 22:22:52 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Sat, 02 May 2009 11:05:31 GMT]]></title><description><![CDATA[<p>... und dir malloc / vector im Allgemeinen keinen ausführbaren Speicher zur Verfügung stellt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704373</guid><dc:creator><![CDATA[Superlexx]]></dc:creator><pubDate>Sat, 02 May 2009 11:05:31 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Sat, 02 May 2009 11:17:01 GMT]]></title><description><![CDATA[<p>Superlexx schrieb:</p>
<blockquote>
<p>... ausführbaren Speicher</p>
</blockquote>
<p>Das müsstest du nochmal erklären ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704381</guid><dc:creator><![CDATA[Nachfrager]]></dc:creator><pubDate>Sat, 02 May 2009 11:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Sat, 02 May 2009 13:31:12 GMT]]></title><description><![CDATA[<p>Es ist auf machen Plattformen so, dass es Speicher gibt, der zwar les- und beschreibbar ist, aber sobald man versucht, ein in diesem Speicher liegendes Stück Programm auszuführen, man eine Exception bekommt. Zu solchen Plattformen gehört z.B. Windows XP SP2 und später, wenn sie auf halbwegs aktuellen CPUs laufen, das nennt sich dann DEP.<br />
Und solcher Speicher wird dann im Allgemeinen von new bzw. malloc alloziert (gibt auch Ausnahmen, siehe NXCOMPAT). Wenn man ausführbaren Speicher allozieren möchte, dann muss das mit plattformspezifischen Mitteln geschehen, etwa VirtualAlloc + VirtualProtect unter Windows XP etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704448</guid><dc:creator><![CDATA[Superlexx]]></dc:creator><pubDate>Sat, 02 May 2009 13:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to unerwartetes Runden on Sun, 03 May 2009 23:45:26 GMT]]></title><description><![CDATA[<p>Gut erklärt!</p>
<p>An npfs Beispiel sieht man, was selbst bei einer vermeintlich leichten Aufgabe alles schief gehen kann. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Mehr dazu und warum es mit Standardeinstellungen auch unter XP2 meist doch klappt findet sich in dem Dokument</p>
<p>03_CIF_Memory_Protection.DOC</p>
<p>unter</p>
<p><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7bd948d7-b791-40b6-8364-685b84158c78" rel="nofollow">http://www.microsoft.com/downloads/details.aspx?FamilyID=7bd948d7-b791-40b6-8364-685b84158c78</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1705064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1705064</guid><dc:creator><![CDATA[Nachfrager]]></dc:creator><pubDate>Sun, 03 May 2009 23:45:26 GMT</pubDate></item></channel></rss>