<?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[Maschinenroutine in C++]]></title><description><![CDATA[<p>Hallo, Leute.</p>
<p>Nachdem ich mich informiert habe, wie man einen Zeiger auf eine Funktion definiert, habe ich ein neues Problem, und weiß nicht, wie ich es lösen kann.<br />
Ich möchte gerne in einem Speicherbereich eine Maschinenroutine speichern<br />
(wofür und warum ist erstmal zweitranging) und diese dann innerhalb vom Programm aufrufen. Das ganze stelle ich mir in etwa so vor:</p>
<pre><code class="language-cpp">// Beispiel.cpp
// ------------

#incude &lt;iostream&gt;

using namespace std;

void Zeichen(char c)
{
  char *Asm = new char[7];
  // Befehle speichern:
  Asm[0] = 0xB2; Asm[1] = c;     // MOV DL, c
  Asm[2] = 0xB4; Asm[3] = 2;     // MOV AH, 2
  Asm[4] = 0xCD; Asm[5] = 0x21;  // INT 21h
  Asm[6] = 0xCB;                 // RETF
  // Aufrufen:
  Asm;
  // oder: Asm(); ? oder wie?
}

int main()
{
  cout &lt;&lt; &quot;Jetzt wird ein A ausgegeben:&quot; &lt;&lt; endl;
  Zeichen('A');
  cout &lt;&lt; endl
       &lt;&lt; &quot;Stimmt.&quot; &lt;&lt; endl;
  return 0;
}
</code></pre>
<p>Ich habe aber schon mehrere Varianten von Zeile 17 ausprobiert, z.B. per<br />
Funktionszeiger auf Asm, aber egal, wie ich's anstelle:<br />
Je nach Variante geschieht entweder nichts<br />
- sprich ich erhalte folgende Ausgabe:</p>
<pre><code>Jetzt wird ein A ausgegeben:

Stimmt.
</code></pre>
<p>Oder der Compiler bringt mir eine Fehlermeldung, die besagt, dass er die Typen nicht umwandeln kann ( char* und char(*)() ), oder Asm nicht als Funktion verwendet werden kann.</p>
<p>Wer kann mir bitte, bitte helfen.</p>
<p>Danke bereits im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183642/maschinenroutine-in-c</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 10:14:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183642.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Jun 2007 02:40:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 02:40:10 GMT]]></title><description><![CDATA[<p>Hallo, Leute.</p>
<p>Nachdem ich mich informiert habe, wie man einen Zeiger auf eine Funktion definiert, habe ich ein neues Problem, und weiß nicht, wie ich es lösen kann.<br />
Ich möchte gerne in einem Speicherbereich eine Maschinenroutine speichern<br />
(wofür und warum ist erstmal zweitranging) und diese dann innerhalb vom Programm aufrufen. Das ganze stelle ich mir in etwa so vor:</p>
<pre><code class="language-cpp">// Beispiel.cpp
// ------------

#incude &lt;iostream&gt;

using namespace std;

void Zeichen(char c)
{
  char *Asm = new char[7];
  // Befehle speichern:
  Asm[0] = 0xB2; Asm[1] = c;     // MOV DL, c
  Asm[2] = 0xB4; Asm[3] = 2;     // MOV AH, 2
  Asm[4] = 0xCD; Asm[5] = 0x21;  // INT 21h
  Asm[6] = 0xCB;                 // RETF
  // Aufrufen:
  Asm;
  // oder: Asm(); ? oder wie?
}

int main()
{
  cout &lt;&lt; &quot;Jetzt wird ein A ausgegeben:&quot; &lt;&lt; endl;
  Zeichen('A');
  cout &lt;&lt; endl
       &lt;&lt; &quot;Stimmt.&quot; &lt;&lt; endl;
  return 0;
}
</code></pre>
<p>Ich habe aber schon mehrere Varianten von Zeile 17 ausprobiert, z.B. per<br />
Funktionszeiger auf Asm, aber egal, wie ich's anstelle:<br />
Je nach Variante geschieht entweder nichts<br />
- sprich ich erhalte folgende Ausgabe:</p>
<pre><code>Jetzt wird ein A ausgegeben:

Stimmt.
</code></pre>
<p>Oder der Compiler bringt mir eine Fehlermeldung, die besagt, dass er die Typen nicht umwandeln kann ( char* und char(*)() ), oder Asm nicht als Funktion verwendet werden kann.</p>
<p>Wer kann mir bitte, bitte helfen.</p>
<p>Danke bereits im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300440</guid><dc:creator><![CDATA[KRobert]]></dc:creator><pubDate>Thu, 07 Jun 2007 02:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 04:47:45 GMT]]></title><description><![CDATA[<p>Ich weiss nicht ob es vom Betriebssystem und vom Compiler abhängt.<br />
Bei mir kann man im Quellcode Assemblerbefehle so einbinden:</p>
<pre><code>__asm mov al, 2
</code></pre>
<p>Schau mal in der Doku deines Compilers nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300451</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Thu, 07 Jun 2007 04:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 04:50:49 GMT]]></title><description><![CDATA[<p>Ja das kann ich mit asm auch,<br />
aber ich möchte auch mal Maschinencode einbinden,<br />
z.B. könnte ich den ja in einer externen Datei speichern und<br />
benötige ihn dann und dann muss der ja irgendwo gespeichert werden<br />
und von da aus aufgerufen.<br />
Deswegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300452</guid><dc:creator><![CDATA[KRobert]]></dc:creator><pubDate>Thu, 07 Jun 2007 04:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 06:30:38 GMT]]></title><description><![CDATA[<p>Vgl. Daten vs. Code. Daten können nicht ohne weiteres ausgeführt werden. Der ISO C++ hat sowas von keine Ahnung davon...</p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300475</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 07 Jun 2007 06:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 06:59:21 GMT]]></title><description><![CDATA[<p>Lol, das sieht aus wie der VB6-Inline-ASM-Hack. Wenn man mal von eventuellen NX-Flags absieht, könnte das sogar klappen. Man müsste nur den Zeiger auf einen Funktionszeiger casten. Dafür muss man aber den Umweg über 'void*' gehen, weil man nicht direkt casten darf:</p>
<pre><code class="language-cpp">void* pv = ASM;
void (*fun)() = static_cast&lt;void (*)()&gt;(pv);
fun();
</code></pre>
<p>(Von solchen Späßchen ist natürlich abzuraten!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300484</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 07 Jun 2007 06:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 07:27:29 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Lol, das sieht aus wie der VB6-Inline-ASM-Hack. Wenn man mal von eventuellen NX-Flags absieht, könnte das sogar klappen. Man müsste nur den Zeiger auf einen Funktionszeiger casten. Dafür muss man aber den Umweg über 'void*' gehen, weil man nicht direkt casten darf:</p>
<pre><code class="language-cpp">void* pv = ASM;
void (*fun)() = static_cast&lt;void (*)()&gt;(pv);
fun();
</code></pre>
<p>(Von solchen Späßchen ist natürlich abzuraten!)</p>
</blockquote>
<p>vor allem, weil nicht garantiert ist, dass void* und funktionszeiger dieselbe größe haben. (auch wenn es afaik auf allen POSIX system garantiert ist)<br />
deshalb darf man ja auch keinen funktionszeiger nach void* casten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300498</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 07 Jun 2007 07:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 07:33:08 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>vor allem, weil nicht garantiert ist, dass void* und funktionszeiger dieselbe größe haben. (auch wenn es afaik auf allen POSIX system garantiert ist)<br />
deshalb darf man ja auch keinen funktionszeiger nach void* casten.</p>
</blockquote>
<p>Hmm, da hattu recht. Wieso erlaubt mir das der VC++-Compiler dann eigentlich? Dummes Ding. <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="😞"
    /><br />
– Ist aber auch wurst, funktioniert eh nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300502</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 07 Jun 2007 07:33:08 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 09:04:39 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Hmm, da hattu recht. Wieso erlaubt mir das der VC++-Compiler dann eigentlich? Dummes Ding. <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>
</blockquote>
<p>weil unter windoofs ein function pointer auch nur 32 bit hat, wie alle anderen pointer auch und der prozessor im 'flat memory model' läuft. auf systemen mit verschiedenen pointerbreiten (far, near, ...), und/oder paged memory bekommste vom compiler entsprechende warnings, wenn etwas nicht passen sollte...<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1300550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300550</guid><dc:creator><![CDATA[pale dog]]></dc:creator><pubDate>Thu, 07 Jun 2007 09:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 14:00:42 GMT]]></title><description><![CDATA[<p>Wieso nicht so?</p>
<pre><code class="language-cpp">void call_asm_thingy(void* asm_thingy)
{
    __asm mov eax, asm_thingy
    __asm call eax
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1300764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300764</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Jun 2007 14:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Maschinenroutine in C++ on Thu, 07 Jun 2007 18:37:19 GMT]]></title><description><![CDATA[<p>warum nehmt ihr nicht einfach:</p>
<pre><code class="language-cpp">__asm__ /*__volatide__ */ (&quot;movl ...&quot;);
</code></pre>
<p>? Könnt ihr doch direkt Asemmbly-Befehle ausführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300913</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 07 Jun 2007 18:37:19 GMT</pubDate></item></channel></rss>