<?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[Visual C++: Template + Inline Assembler]]></title><description><![CDATA[<p>Ich versuche gerade std::bitset nachzuproggen, um mal meine Assemblerkenntnisse aufzufrischen.</p>
<p>Die Klasse übernimmt als template-argument size_t N. Die Werte selbst werden in einem Array von Ints gespeichert, d.h. die Klasse besitzt einen Zeiger auf Ints.<br />
Neben dem int*, besitzt die Klasse auch noch einen size_t, der die Anzahl an ints angibt, d.h. die einzige Möglichkeit an die ursprüngliche Anzahl an &quot;Bits&quot; zu kommen, ist N auszulesen.</p>
<pre><code class="language-cpp">template&lt;size_t N&gt;
struct bitset
{
    size_t nInts_;
    int* pInts_;
</code></pre>
<p>In C++ kein Problem. In Assembler allerdings schon, weil solche Statements verboten sind:</p>
<pre><code class="language-asm">mov     eax, N ; müsste eigentlich gehen, weil N size_t ist
</code></pre>
<pre><code class="language-cpp">template&lt;size_t N&gt;
void resize_string(string* str) // keine Methode, sondern nur eine Funktion
{
    str-&gt;resize(N);
}

// ...

template&lt;size_t N&gt;
std::string bitset&lt;N&gt;::to_string() const
{
    __asm
    {
        call    resize_string ; gibt einen Fehler, obwohl die 
    }
}
</code></pre>
<p>wie kann ich jetzt trotzdem an N gelangen, ohne einen weiteren size_t zu meinem bitset hinzuzufügen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153266/visual-c-template-inline-assembler</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 11:24:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153266.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Jul 2006 15:49:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Visual C++: Template + Inline Assembler on Fri, 14 Jul 2006 15:49:56 GMT]]></title><description><![CDATA[<p>Ich versuche gerade std::bitset nachzuproggen, um mal meine Assemblerkenntnisse aufzufrischen.</p>
<p>Die Klasse übernimmt als template-argument size_t N. Die Werte selbst werden in einem Array von Ints gespeichert, d.h. die Klasse besitzt einen Zeiger auf Ints.<br />
Neben dem int*, besitzt die Klasse auch noch einen size_t, der die Anzahl an ints angibt, d.h. die einzige Möglichkeit an die ursprüngliche Anzahl an &quot;Bits&quot; zu kommen, ist N auszulesen.</p>
<pre><code class="language-cpp">template&lt;size_t N&gt;
struct bitset
{
    size_t nInts_;
    int* pInts_;
</code></pre>
<p>In C++ kein Problem. In Assembler allerdings schon, weil solche Statements verboten sind:</p>
<pre><code class="language-asm">mov     eax, N ; müsste eigentlich gehen, weil N size_t ist
</code></pre>
<pre><code class="language-cpp">template&lt;size_t N&gt;
void resize_string(string* str) // keine Methode, sondern nur eine Funktion
{
    str-&gt;resize(N);
}

// ...

template&lt;size_t N&gt;
std::string bitset&lt;N&gt;::to_string() const
{
    __asm
    {
        call    resize_string ; gibt einen Fehler, obwohl die 
    }
}
</code></pre>
<p>wie kann ich jetzt trotzdem an N gelangen, ohne einen weiteren size_t zu meinem bitset hinzuzufügen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097816</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Fri, 14 Jul 2006 15:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++: Template + Inline Assembler on Fri, 14 Jul 2006 20:36:43 GMT]]></title><description><![CDATA[<p>Das dürfte nicht gehen. Assembler und Templates vertragen sich nunmal nicht sonderlich gut. Speziell, weil Assembler nicht den geringsten Schimmer von Template Funktionalität hat.<br />
Um es jetzt noch etwas deutlicher zu sagen, du rufst folgende Funktion auf</p>
<pre><code class="language-asm">call    resize_string
</code></pre>
<p>Es gibt aber keine Funktion resize_string. Es gibt nur das Template resize_string&lt;size_t&gt;. Dieses instanziert zu resize_string&lt;10&gt; oder resize_string&lt;100&gt; oder was auch immer. Ich wüsste nicht, wie man mit Assembler darauf zugreifen könnte. Mit Intel Syntax sicherlich nicht. Ich hoffe, du verstehst wo die Problematik liegt. Du kannst nur versuchen, alles so weit zu abstrahieren, dass Nicht-Template Routinen übrig bleiben, welche sich dann mit Assembler implementieren lassen.<br />
Aber ehrlich gesagt, ich wüsste nicht, wieso man einen solchen Container überhaupt mit Assembler implementieren sollte. Zumindest unter C++. Um deine Assembler Kenntnisse aufzufrischen, gibt es sicherlich sinnvollere Sachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097960</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 14 Jul 2006 20:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++: Template + Inline Assembler on Fri, 14 Jul 2006 20:59:09 GMT]]></title><description><![CDATA[<p>resize_string existiert so ja gar nicht. Eine entsprechende Funktion wird für jede Instanz von resize_string&lt;N&gt; vom Compiler erzeugt. Also musst du die Funktion vorher instanzieren.</p>
<p>schau dir mal folgendes Beispiel an</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;std::size_t N&gt;
std::size_t f() { return N; }

template&lt;std::size_t N&gt;
void g() {
  typedef std::size_t (*func_t)();
  func_t ff = f&lt;N&gt;;
  std::cout &lt;&lt; std::hex &lt;&lt; reinterpret_cast&lt;void*&gt;(ff) &lt;&lt; '\n';
}

int main() {
  g&lt;5&gt;();
  g&lt;6&gt;();
}
</code></pre>
<p>Mit dem Template-Parameter kannst du vielleicht tricksen. Wenn du auf enums zugreifen kannst, sollte folgendes vll helfen</p>
<pre><code class="language-cpp">template&lt;std::size_t N&gt;
void foo() {
 enum { n=N };
 asm {
   mov eax, n
 }
}
</code></pre>
<p>HTH viel spaß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097970</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Fri, 14 Jul 2006 20:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++: Template + Inline Assembler on Tue, 18 Jul 2006 00:02:27 GMT]]></title><description><![CDATA[<p>kingruedi schrieb:</p>
<blockquote>
<p>resize_string existiert so ja gar nicht. Eine entsprechende Funktion wird für jede Instanz von resize_string&lt;N&gt; vom Compiler erzeugt. Also musst du die Funktion vorher instanzieren.</p>
</blockquote>
<p>ich weiß wie templates funktionieren. aber sowas hätte halt eben nur als methode von bitset geklappt.</p>
<blockquote>
<p>Mit dem Template-Parameter kannst du vielleicht tricksen. Wenn du auf enums zugreifen kannst, sollte folgendes vll helfen</p>
</blockquote>
<p>funzt! Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099486</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Tue, 18 Jul 2006 00:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++: Template + Inline Assembler on Tue, 18 Jul 2006 20:50:11 GMT]]></title><description><![CDATA[<p>kingruedi schrieb:</p>
<blockquote>
<p>Mit dem Template-Parameter kannst du vielleicht tricksen. Wenn du auf enums zugreifen kannst, sollte folgendes vll helfen</p>
</blockquote>
<p>Du kannst dafür auch static const Member benutzen. Das sollte eigentlich jeder aktuelle Compiler beherrschen und ist, im Gegensatz zu enum, kein Hack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1100069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1100069</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 18 Jul 2006 20:50:11 GMT</pubDate></item></channel></rss>