<?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[asm Block und template Argument]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also ich habe folgenden Code:</p>
<pre><code>void changeRegister(std::uint32_t* esp) {
	*(esp + 7) = 0xaabbccdd; // Set EAX
}

template&lt;void* callAddr&gt;
__declspec(naked) void  stackWrapper() {

	__asm {
		pushad;
		push esp;
		mov eax, dword ptr callAddr;
		call eax;

		pop eax;
		popad;
		ret;
	}
}

int main() {
    stackWrapper&lt;changeRegister&gt;();
}
</code></pre>
<p>Die 'StackWrapper' Funktion soll ein helper sein mit der automatisch ein Codeblock erstellt wird der die Funktion die als Template Argument uebergeben wird aufruft.<br />
Allerdings wird mit Visual Stduio 2015 folgender Code erzeugt (kopiert bei der Ausfuehrung im Dissassembly Fenster):</p>
<pre><code>;       stackWrapper
;	__asm {
		pushad;
;00BD7D60 60                   pushad  
		push esp;
;00BD7D61 54                   push        esp  
		mov eax, dword ptr callAddr;
;00BD7D62 A1 00 00 00 00       mov         eax,dword ptr ds:[00000000h]  
		call eax;
;00BD7D67 FF D0                call        eax  

		pop eax;
;00BD7D69 58                   pop         eax  
		popad;
;00BD7D6A 61                   popad  
		ret;
;00BD7D6B C3                   ret
</code></pre>
<p>Wie man sieht schreibt er 0x00 in EAX statt die Funktions Addresse wie ich eigentlich dachte.<br />
Jetzt ist die Frage warum das so ist.<br />
Kann man Template Argumente in einem asm Block einfach nicht verwenden. Oder liegt das vielleicht an Visual Studio. Oder hab ich da einfach einen Denkfehler ?</p>
<p>Die Addresse der Funktion ist ja beim Ubersetzten bekannt bzw kann durch eine Relocation angepasst werden.</p>
<p>Danke und schoene Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339776/asm-block-und-template-argument</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 21:24:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339776.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Sep 2016 21:47:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to asm Block und template Argument on Tue, 27 Sep 2016 21:47:09 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also ich habe folgenden Code:</p>
<pre><code>void changeRegister(std::uint32_t* esp) {
	*(esp + 7) = 0xaabbccdd; // Set EAX
}

template&lt;void* callAddr&gt;
__declspec(naked) void  stackWrapper() {

	__asm {
		pushad;
		push esp;
		mov eax, dword ptr callAddr;
		call eax;

		pop eax;
		popad;
		ret;
	}
}

int main() {
    stackWrapper&lt;changeRegister&gt;();
}
</code></pre>
<p>Die 'StackWrapper' Funktion soll ein helper sein mit der automatisch ein Codeblock erstellt wird der die Funktion die als Template Argument uebergeben wird aufruft.<br />
Allerdings wird mit Visual Stduio 2015 folgender Code erzeugt (kopiert bei der Ausfuehrung im Dissassembly Fenster):</p>
<pre><code>;       stackWrapper
;	__asm {
		pushad;
;00BD7D60 60                   pushad  
		push esp;
;00BD7D61 54                   push        esp  
		mov eax, dword ptr callAddr;
;00BD7D62 A1 00 00 00 00       mov         eax,dword ptr ds:[00000000h]  
		call eax;
;00BD7D67 FF D0                call        eax  

		pop eax;
;00BD7D69 58                   pop         eax  
		popad;
;00BD7D6A 61                   popad  
		ret;
;00BD7D6B C3                   ret
</code></pre>
<p>Wie man sieht schreibt er 0x00 in EAX statt die Funktions Addresse wie ich eigentlich dachte.<br />
Jetzt ist die Frage warum das so ist.<br />
Kann man Template Argumente in einem asm Block einfach nicht verwenden. Oder liegt das vielleicht an Visual Studio. Oder hab ich da einfach einen Denkfehler ?</p>
<p>Die Addresse der Funktion ist ja beim Ubersetzten bekannt bzw kann durch eine Relocation angepasst werden.</p>
<p>Danke und schoene Gruesse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509903</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Tue, 27 Sep 2016 21:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to asm Block und template Argument on Thu, 29 Sep 2016 14:33:31 GMT]]></title><description><![CDATA[<p>Vieleicht weil der compiler und entsprechende kommentarisierung zu der Zeit nicht wussten, dass eax diesen wert hat!?</p>
<p>Debug mal den code und schau dir das Register an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510113</guid><dc:creator><![CDATA[just fad]]></dc:creator><pubDate>Thu, 29 Sep 2016 14:33:31 GMT</pubDate></item><item><title><![CDATA[Reply to asm Block und template Argument on Thu, 29 Sep 2016 14:37:45 GMT]]></title><description><![CDATA[<p>just fad schrieb:</p>
<blockquote>
<p>Vieleicht weil der compiler und entsprechende kommentarisierung zu der Zeit nicht wussten, dass eax diesen wert hat!?</p>
<p>Debug mal den code und schau dir das Register an.</p>
</blockquote>
<p>Wie meinst du das genau ? Der oben gezeigt Assembler Block ist die Ausgabe vom &quot;Disassembly&quot; Fenster in Visual Studio waehrend dem debuggen. In EAX wir auch 0 reingeschrieben. Und beim &quot;call&quot; kommt eine read exception @ 0x00000000.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2510114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2510114</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Thu, 29 Sep 2016 14:37:45 GMT</pubDate></item></channel></rss>