<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx</link><description>Hello NTdebuggers, I'm very impressed with the depth of the answers we are seeing from our readers. As I stated in last week's response, this week's puzzler is going to be harder. With that said let's take it up a notch. One of the things that is really</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Microsoft news and tips &amp;raquo; NTDebugging Puzzler 0&amp;#215;00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8414875</link><pubDate>Mon, 21 Apr 2008 19:00:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8414875</guid><dc:creator>Microsoft news and tips &amp;raquo; NTDebugging Puzzler 0&amp;#215;00000003 (Matrix Edition) Some assembly required.</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://microsoftnews.askpcdoc.com/?p=3492"&gt;http://microsoftnews.askpcdoc.com/?p=3492&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415162</link><pubDate>Mon, 21 Apr 2008 21:42:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415162</guid><dc:creator>Skywing</dc:creator><description>&lt;P&gt;That sucks to read with the opcode bytes indenting things unevenly :( &amp;nbsp;Any chance you could just post the binary itself?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;------------------------------------&lt;/P&gt;
&lt;P&gt;I've changed the HTML so the spaces should be fixed width.&amp;nbsp;&amp;nbsp; I'd prefer not to share the binary as that could be executed and could give the answer away.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Jeff-&lt;/P&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415221</link><pubDate>Mon, 21 Apr 2008 22:23:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415221</guid><dc:creator>C. Watford</dc:creator><description>&lt;p&gt;Good puzzler, hadn't used my decompiling skills in a while. I guess now the new puzzler is finding input that makes sense after myfun returns!&lt;/p&gt;
&lt;p&gt;My solution is on my blog to avoid spoilers.&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415319</link><pubDate>Mon, 21 Apr 2008 23:07:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415319</guid><dc:creator>Matthieu</dc:creator><description>&lt;p&gt;void myfun(char *string)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;int lenString, countLoop, index;&lt;/p&gt;
&lt;p&gt;char savedByte;&lt;/p&gt;
&lt;p&gt;lenString = strlen(string);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for (countLoop = lenString; countLoop; countLoop--)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(index = 0; index &amp;lt; countLoop; index++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;countLoop --;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (string[index] &amp;gt; string[index + 1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;savedByte = string[index];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[index] = string[index + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[index + 1] = savedByte;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415355</link><pubDate>Mon, 21 Apr 2008 23:31:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415355</guid><dc:creator>Mark Steward</dc:creator><description>&lt;p&gt;It's a cdecl function to bubble sort a string of chars into ascending order. &amp;nbsp;I hope you're avoiding spoilers by moderating comments, so code will follow shortly.&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415574</link><pubDate>Tue, 22 Apr 2008 01:16:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415574</guid><dc:creator>Mark Steward</dc:creator><description>&lt;p&gt;The locals are in a different order, but this seems to match...&lt;/p&gt;
&lt;p&gt;// Puzzler3.cpp : Defines the entry point for the console application.&lt;/p&gt;
&lt;p&gt;//&lt;/p&gt;
&lt;p&gt;#include &amp;quot;Puzzler3.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;string.h&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;tchar.h&amp;gt;&lt;/p&gt;
&lt;p&gt;int _tmain(int argc, _TCHAR* argv[])&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	// Simple test on myfun&lt;/p&gt;
&lt;p&gt;	char str[] = &amp;quot;Hello there everybody\0&amp;quot;;&lt;/p&gt;
&lt;p&gt;	myfun(str);&lt;/p&gt;
&lt;p&gt;	printf(str);&lt;/p&gt;
&lt;p&gt;	return 0;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;void myfun(char* str)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	// Stir chars in array&lt;/p&gt;
&lt;p&gt;	// to their inherent ranking&lt;/p&gt;
&lt;p&gt;	// like tiny bubbles&lt;/p&gt;
&lt;p&gt;	int len = strlen(str);&lt;/p&gt;
&lt;p&gt;	for(int x = len; x &amp;gt; 0; x--)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		for(int y = 0; y &amp;lt; x - 1; y++)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			if(str[y] &amp;gt; str[y + 1])&lt;/p&gt;
&lt;p&gt;			{ &lt;/p&gt;
&lt;p&gt;				char c = str[y];&lt;/p&gt;
&lt;p&gt;				str[y] = str[y + 1];&lt;/p&gt;
&lt;p&gt;				str[y + 1] = c;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415594</link><pubDate>Tue, 22 Apr 2008 01:21:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415594</guid><dc:creator>Infro</dc:creator><description>&lt;p&gt;Created a C function, hope it isn't too far off. Best Regards, happy reversing!&lt;/p&gt;
&lt;p&gt;OurFunction(char* OurString)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	int StringLength = strlen(OurString);&lt;/p&gt;
&lt;p&gt;	for(;StringLength &amp;gt; 0; StringLength--)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		for(int StringLength2 = 0; StringLength - 1 &amp;lt; StringLength2;StringLength++)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			if(OurString[StringLength2+1] &amp;lt;= OurString[StringLength2]) .continue;&lt;/p&gt;
&lt;p&gt;			OurString[StringLength2] = OurString[StringLength2+1];&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1480 55 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;ebp						//OurFunction(Char* Param1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1481 8bec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; ebp,esp						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1483 81ecf0000000 &amp;nbsp; &amp;nbsp;sub &amp;nbsp; &amp;nbsp; esp,0F0h						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1489 53 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;ebx						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc148a 56 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;esi						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc148b 57 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;edi						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc148c 8dbd10ffffff &amp;nbsp; &amp;nbsp;lea &amp;nbsp; &amp;nbsp; edi,[ebp-0F0h]					//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1492 b93c000000 &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; ecx,3Ch						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1497 b8cccccccc &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,0CCCCCCCCh					//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc149c f3ab &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rep stos dword ptr es:[edi]				//int OurData[60];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc149e 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14a1 50 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;eax						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14a2 e803fcffff &amp;nbsp; &amp;nbsp; &amp;nbsp;call &amp;nbsp; &amp;nbsp;puzzler3!ILT+165(_strlen) (00cc10aa)		//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14a7 83c404 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; esp,4						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14aa 8945e0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp-20h],eax				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14ad 8b45e0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-20h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b0 8945f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp-8],eax				//NeverUsed = StringLength = strlen(param1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b3 eb09 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jmp &amp;nbsp; &amp;nbsp; puzzler3!myfun+0x3e (00cc14be)			//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b5 8b45f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-8]				//(Loop End)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b8 83e801 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sub &amp;nbsp; &amp;nbsp; eax,1						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14bb 8945f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp-8],eax				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14be 837df800 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; dword ptr [ebp-8],0				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14c2 7e60 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jle &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa4 (00cc1524)			//for(StringLength; StringLength &amp;gt; 0; StringLength--) {&lt;/p&gt;
&lt;p&gt;											//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14c4 c745ec00000000 &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp-14h],0				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14cb eb09 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jmp &amp;nbsp; &amp;nbsp; puzzler3!myfun+0x56 (00cc14d6)			//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14cd 8b45ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d0 83c001 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,1						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d3 8945ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp-14h],eax				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d6 8b45f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d9 83e801 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sub &amp;nbsp; &amp;nbsp; eax,1						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14dc 3945ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; dword ptr [ebp-14h],eax				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14df 7d41 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jge &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa2 (00cc1522)			//for(StringLength2 = 0; StringLength-1 &amp;lt; StringLength2 ;StringLength2++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14e1 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14e4 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14e7 0fbe08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movsx &amp;nbsp; ecx,byte ptr [eax]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14ea 8b5508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; edx,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14ed 0355ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; edx,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14f0 0fbe4201 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movsx &amp;nbsp; eax,byte ptr [edx+1]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14f4 3bc8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; ecx,eax						//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14f6 7e28 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jle &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa0 (00cc1520)			//if(Param1[StringLength2+1] &amp;lt;= Param1[StringLength2]) .continue&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc14f8 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc14fb 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc14fe 8a08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; cl,byte ptr [eax]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc1500 884dd7 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr [ebp-29h],cl				//Previous = Param1[StringLength2]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1503 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1506 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1509 8b4d08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; ecx,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc150c 034dec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; ecx,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc150f 8a5101 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dl,byte ptr [ecx+1]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1512 8810 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr [eax],dl				//Param1[StringLength] = Param1[StringLength+1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc1514 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp+8]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc1517 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp-14h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc151a 8a4dd7 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; cl,byte ptr [ebp-29h]				//&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc151d 884801 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr [eax+1],cl				//Param1[something+1] = Previous&lt;/p&gt;
&lt;p&gt;											//}}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415653</link><pubDate>Tue, 22 Apr 2008 01:59:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415653</guid><dc:creator>Grant</dc:creator><description>&lt;p&gt;Heh, I'm pretty rusty.&lt;/p&gt;
&lt;p&gt;If I had to guess I'd say its trying to bubble sort the characters in a string something along these lines:&lt;/p&gt;
&lt;p&gt;void f(char *s) {&lt;/p&gt;
&lt;p&gt;	int len=strlen(str);&lt;/p&gt;
&lt;p&gt;	for(int top=len;top&amp;gt;0;--top) {&lt;/p&gt;
&lt;p&gt;		for(int i=0;i&amp;lt;top-1;++i) {&lt;/p&gt;
&lt;p&gt;			if(str[i]&amp;gt;str[i+1]) {&lt;/p&gt;
&lt;p&gt;				char tmp=str[i];&lt;/p&gt;
&lt;p&gt;				str[i]=s[i+1];&lt;/p&gt;
&lt;p&gt;				str[i+1]=tmp;				&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;(I'm not sure about what it returns....)&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415764</link><pubDate>Tue, 22 Apr 2008 03:52:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415764</guid><dc:creator>Doug</dc:creator><description>&lt;p&gt;No idea how well this will paste but here's my quick analysis (prolly off on the comparisons or some such).&lt;/p&gt;
&lt;p&gt;&amp;lt;pre&amp;gt;&lt;/p&gt;
&lt;p&gt;puzzler3!myfun [c:\source\puzzler\puzzler3\puzzler3\puzzler3.cpp @ 20]:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;; Prologue&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1480 55 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;ebp&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1481 8bec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; ebp,esp&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1483 81ecf0000000 &amp;nbsp; &amp;nbsp;sub &amp;nbsp; &amp;nbsp; esp,0F0h&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1489 53 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;ebx&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc148a 56 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;esi&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc148b 57 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;edi&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;; 240 bytes of local storage&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc148c 8dbd10ffffff &amp;nbsp; &amp;nbsp;lea &amp;nbsp; &amp;nbsp; edi,[ebp-0F0h]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;; Fill all local space (0xf0) with 0xcc&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;; memset(ebp-0xf0, 0xcc, 0xf0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1492 b93c000000 &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; ecx,3Ch&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc1497 b8cccccccc &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,0CCCCCCCCh&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 20 00cc149c f3ab &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rep stos dword ptr es:[edi]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;; strlen(arg1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc149e 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14a1 50 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;push &amp;nbsp; &amp;nbsp;eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14a2 e803fcffff &amp;nbsp; &amp;nbsp; &amp;nbsp;call &amp;nbsp; &amp;nbsp;puzzler3!ILT+165(_strlen) (00cc10aa)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14a7 83c404 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; esp,4&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 00cc14aa 8945e0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp - strlen_ARG1],eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; For (i = strlen(ARG1) ; &amp;nbsp;i &amp;gt; 0; &amp;nbsp;i--)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; i = strlen(ARG1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14ad 8b45e0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - strlen_ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b0 8945f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp - _i_],eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b3 eb09 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jmp &amp;nbsp; &amp;nbsp; puzzler3!myfun+0x3e (00cc14be)&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt;; OUTER_LOOP_CONTINUE&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; i--&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b5 8b45f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _i_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14b8 83e801 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sub &amp;nbsp; &amp;nbsp; eax,1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14bb 8945f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp - _i_],eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Check i &amp;gt; 0&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14be 837df800 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; dword ptr [ebp - _i_],0&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 00cc14c2 7e60 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jle &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa4 (00cc1524) ; END_OUTER_LOOP&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; //for&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; for (j = 0 ; &amp;nbsp;j &amp;lt; i - 1; &amp;nbsp; j++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; j = 0&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14c4 c745ec00000000 &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp - _j_],0&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14cb eb09 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jmp &amp;nbsp; &amp;nbsp; puzzler3!myfun+0x56 (00cc14d6)&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt;; INNER_LOOP_CONTINUE&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; j = j + 1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14cd 8b45ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d0 83c001 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d3 8945ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dword ptr [ebp - _j_],eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;; Check j &amp;lt; i - 1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d6 8b45f8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _i_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14d9 83e801 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sub &amp;nbsp; &amp;nbsp; eax,1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14dc 3945ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; dword ptr [ebp - _j_],eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 00cc14df 7d41 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jge &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa2 (00cc1522) &amp;nbsp;; INNER_LOOP_DONE&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; char c = ARG1[j]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14e1 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14e4 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14e7 0fbe08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movsx &amp;nbsp; ecx,byte ptr [eax]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; char d = ARG1[j+1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14ea 8b5508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; edx,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14ed 0355ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; edx,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14f0 0fbe4201 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movsx &amp;nbsp; eax,byte ptr [edx+1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; if (c &amp;gt; d) { // signed compare&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14f4 3bc8 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; ecx,eax&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 00cc14f6 7e28 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jle &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa0 (00cc1520)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; unsigned char e = ARG1[j]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc14f8 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc14fb 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc14fe 8a08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; cl,byte ptr [eax]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 00cc1500 884dd7 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr [ebp-29h],cl&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; ARG[j] = ARG[j+1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1503 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1506 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1509 8b4d08 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; ecx,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc150c 034dec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; ecx,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc150f 8a5101 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; dl,byte ptr [ecx+1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 00cc1512 8810 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr [eax],dl&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; ARG[j+1] = e&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc1514 8b4508 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp + ARG1]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc1517 0345ec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; eax,dword ptr [ebp - _j_]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc151a 8a4dd7 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; cl,byte ptr [ebp-29h]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 00cc151d 884801 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; byte ptr [eax+1],cl&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ; } // if&lt;/p&gt;
&lt;p&gt; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 38 00cc1520 ebab &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jmp &amp;nbsp; &amp;nbsp; puzzler3!myfun+0x4d (00cc14cd) ; INNER_LOOP_CONTINUE&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt;; INNER_LOOP_DONE&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 40 00cc1522 eb91 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jmp &amp;nbsp; &amp;nbsp; puzzler3!myfun+0x35 (00cc14b5) ; OUTER_LOOP_CONTINUE&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt;; END_OUTER_LOOP&lt;/p&gt;
&lt;p&gt;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1524 5f &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pop &amp;nbsp; &amp;nbsp; edi&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1525 5e &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pop &amp;nbsp; &amp;nbsp; esi&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1526 5b &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pop &amp;nbsp; &amp;nbsp; ebx&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1527 81c4f0000000 &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; esp,0F0h&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc152d 3bec &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cmp &amp;nbsp; &amp;nbsp; ebp,esp&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc152f e820fcffff &amp;nbsp; &amp;nbsp; &amp;nbsp;call &amp;nbsp; &amp;nbsp;puzzler3!ILT+335(__RTC_CheckEsp) (00cc1154)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1534 8be5 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mov &amp;nbsp; &amp;nbsp; esp,ebp&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1536 5d &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pop &amp;nbsp; &amp;nbsp; ebp&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 00cc1537 c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret&lt;/p&gt;
&lt;p&gt;void myfun(char *mystr)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int i, j;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int len;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;len = strlen(mystr);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for (i = len; i &amp;gt; 0; i--) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (j = 0; j &amp;lt; i - 1; j++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (mystr[j] &amp;lt; mystr[j+1]) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unsigned char c = mystr[j];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mystr[j] = mystr[j+1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mystr[j+1] = c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;lt;/pre&amp;gt;&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415931</link><pubDate>Tue, 22 Apr 2008 06:36:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415931</guid><dc:creator>Mo</dc:creator><description>&lt;p&gt;bubble sort!&lt;/p&gt;
&lt;p&gt;There are too many give aways from debug build disassembly. Can't wait next monday night again :)&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8415959</link><pubDate>Tue, 22 Apr 2008 06:57:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415959</guid><dc:creator>Moso</dc:creator><description>&lt;p&gt;bubble sort!&lt;/p&gt;
&lt;p&gt;There are too many give away from debug build disassembly :)&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416014</link><pubDate>Tue, 22 Apr 2008 07:58:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416014</guid><dc:creator>sundr</dc:creator><description>&lt;p&gt;A debug-compiled version of:&lt;/p&gt;
&lt;p&gt;void bubble_sort(char* array) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int unused, curr_len;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;curr_len = unused =(int)strlen(array);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for ( ; curr_len &amp;gt; 0; curr_len--) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; (curr_len - 1); i++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( *(array + i) &amp;gt; *(array + i +1) ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char tmp = *(array + i);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(array + i) = *(array + i +1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(array + i +1) = tmp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416080</link><pubDate>Tue, 22 Apr 2008 08:55:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416080</guid><dc:creator>xiaowei</dc:creator><description>&lt;p&gt;void myfun(char *pszText)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int &amp;nbsp;i, j;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char t;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;i = strlen(pszText);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for( ; i &amp;gt; 0; --i)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(j = 0; j &amp;lt; i - 1; ++j)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pszText[j] &amp;gt; pszText[j + 1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;t = pszText[j];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pszText[j] = pszText[j + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pszText[j + 1] = t;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return pszText;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416104</link><pubDate>Tue, 22 Apr 2008 09:10:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416104</guid><dc:creator>xiaowei</dc:creator><description>&lt;p&gt;void myfun(char *pszText)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int &amp;nbsp;i, j;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char t;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;i = strlen(pszText);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for( ; i &amp;gt; 0; --i)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(j = 0; j &amp;lt; i - 1; ++j)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pszText[j] &amp;gt; pszText[j + 1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;t = pszText[j];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pszText[j] = pszText[j + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pszText[j + 1] = t;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416210</link><pubDate>Tue, 22 Apr 2008 10:56:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416210</guid><dc:creator>Mats G</dc:creator><description>&lt;p&gt;This was fun! :)&lt;/p&gt;
&lt;p&gt;Looks like a bubble-sort for strings?&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416256</link><pubDate>Tue, 22 Apr 2008 11:40:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416256</guid><dc:creator>aledh</dc:creator><description>&lt;p&gt;Here's my rough first-cut take on it, though I'm a bit rusty with asm!&lt;/p&gt;
&lt;p&gt;It is a function that takes in a string and rearranges the letters in it so that they are in alphabetical order (e.g. &amp;quot;aziewe&amp;quot; becomes &amp;quot;aeeiwz&amp;quot;).&lt;/p&gt;
&lt;p&gt;void myfun(char* s)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	int len = (int)strlen(s);&lt;/p&gt;
&lt;p&gt;	for (int i = len; i &amp;gt; 0; i--) {&lt;/p&gt;
&lt;p&gt;		for (int j = 0; j &amp;lt; i-1; j++) {&lt;/p&gt;
&lt;p&gt;			char* p = s+j;&lt;/p&gt;
&lt;p&gt;			char ch1 = *p;&lt;/p&gt;
&lt;p&gt;			char ch2 = *(p+1);&lt;/p&gt;
&lt;p&gt;			if (ch1 &amp;gt; ch2) {&lt;/p&gt;
&lt;p&gt;				*p = ch2;&lt;/p&gt;
&lt;p&gt;				*(p+1) = ch1;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;-Aled&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416443</link><pubDate>Tue, 22 Apr 2008 15:27:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416443</guid><dc:creator>zzz</dc:creator><description>&lt;p&gt;it sorts the chars in the given string in ascii order.&lt;/p&gt;
&lt;p&gt;void myfun (char *str)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int i, j, len;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;char c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;len = strlen (str);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;for (i = len; i &amp;gt; 0; --i)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for (j = 0; j &amp;lt; i - 1; ++j)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (str[j] &amp;gt; str[j + 1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c = str[j];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str[j] = str[j + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str[j + 1] = c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>Bubble sort</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416604</link><pubDate>Tue, 22 Apr 2008 17:42:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416604</guid><dc:creator>magiK</dc:creator><description>&lt;p&gt;It's a simple bubble sort :)&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://rafb.net/p/GYi6OL16.html"&gt;http://rafb.net/p/GYi6OL16.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Bubble sort</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416618</link><pubDate>Tue, 22 Apr 2008 17:58:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416618</guid><dc:creator>magiK</dc:creator><description>&lt;p&gt;It's a simple bubble sort :)&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://rafb.net/p/GYi6OL16.html"&gt;http://rafb.net/p/GYi6OL16.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416872</link><pubDate>Tue, 22 Apr 2008 20:07:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416872</guid><dc:creator>mbe</dc:creator><description>&lt;p&gt;I didn't have a lot of time to make sure, but it appears (backwards to avoid spoilers):&lt;/p&gt;
&lt;p&gt;redro lacitebahpla ni tros ot&lt;/p&gt;
&lt;p&gt;Hopefully I'll have time to finish marking up the code (and make sure I was right)&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416903</link><pubDate>Tue, 22 Apr 2008 20:17:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416903</guid><dc:creator>molotov</dc:creator><description>&lt;p&gt;OK - be gentle... My first &amp;quot;substantial&amp;quot; attempt at reversing...&lt;/p&gt;
&lt;p&gt;I've spent _way_ too much time on this... ;-/ &lt;/p&gt;
&lt;p&gt;(Hope the code formatting doesn't get messed up...)&lt;/p&gt;
&lt;p&gt;void myfun( char* param1 )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char local4 = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;size_t local1 = strlen( param1 );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for( int local2 = local1; local2 &amp;gt; 0; local2-- )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for( int local3 = 0; local3 &amp;lt; local2 - 1; local3++ )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if( *(param1+local3) &amp;gt; *(param1+local3+1) )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char local4 = *(param1+local3);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(param1+local3) = *(param1+local3+1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(param1+local3+1) = local4;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8416967</link><pubDate>Tue, 22 Apr 2008 20:51:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8416967</guid><dc:creator>molotov</dc:creator><description>&lt;p&gt;Ack... Forgot to yank a leftover local I had used for experimenting... &amp;nbsp;Sorry for the noise.&lt;/p&gt;
&lt;p&gt;Here it is again, with the local removed.&lt;/p&gt;
&lt;p&gt;void myfun( char* param1 )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;size_t local1 = strlen( param1 );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for( int local2 = local1; local2 &amp;gt; 0; local2-- )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for( int local3 = 0; local3 &amp;lt; local2 - 1; local3++ )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if( *(param1+local3) &amp;gt; *(param1+local3+1) )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char local4 = *(param1+local3);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(param1+local3) = *(param1+local3+1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(param1+local3+1) = local4;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8417213</link><pubDate>Tue, 22 Apr 2008 23:50:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8417213</guid><dc:creator>Matt</dc:creator><description>&lt;p&gt;void myfun(char *string)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;int lenString, countLoop, index;&lt;/p&gt;
&lt;p&gt;char savedByte;&lt;/p&gt;
&lt;p&gt;lenString = strlen(string);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; for (countLoop = lenString; countLoop; countLoop--)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(index = 0; index &amp;lt; (countLoop - 1); index++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (string[index] &amp;gt; string[index + 1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; savedByte = string[index];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string[index] = string[index + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string[index + 1] = savedByte;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8417216</link><pubDate>Tue, 22 Apr 2008 23:51:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8417216</guid><dc:creator>Lol</dc:creator><description>&lt;p&gt;for (i = strlen(arg_0); i &amp;gt; 0; i--)&lt;/p&gt;
&lt;p&gt;	for (j = 0; j &amp;lt; (i - 1); j++)&lt;/p&gt;
&lt;p&gt;		if (arg_0[j] &amp;gt; arg_0[j + 1]) {&lt;/p&gt;
&lt;p&gt;			b = arg_0[j];&lt;/p&gt;
&lt;p&gt;			arg_0[j] = arg_0[j + 1];&lt;/p&gt;
&lt;p&gt;			arg_0[j + 1] = b;&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8417360</link><pubDate>Wed, 23 Apr 2008 01:29:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8417360</guid><dc:creator>mbe</dc:creator><description>&lt;p&gt;Okay I think I have my final solution...&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://0xabad1dea.net/ntdebuggers-asm-puzzle-3.txt"&gt;http://0xabad1dea.net/ntdebuggers-asm-puzzle-3.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Way too long to paste here)&lt;/p&gt;
&lt;p&gt;This is the first time I've done this though... may have made a newbie mistake :)&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8417390</link><pubDate>Wed, 23 Apr 2008 01:41:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8417390</guid><dc:creator>Steve</dc:creator><description>&lt;p&gt;hello, nice blog.&lt;/p&gt;
&lt;p&gt;I'm thinking it's a bubble sorting function (or something similar) ...&lt;/p&gt;
&lt;p&gt;// it was compiled with /RTC :)&lt;/p&gt;
&lt;p&gt;void bubble_sort( char * cpString )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int lenght;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int index;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;char c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;length = strlen( cpString );&lt;/p&gt;
&lt;p&gt; &amp;nbsp;for( ; length &amp;gt; 0 ; length-- )&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for( index = 0 ; index &amp;lt; length ; index++ )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if( cpString[index] &amp;gt; cpString[index+1] )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char c = cpString[index];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cpString[index] = cpString[index+1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cpString[index+1] = c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8418474</link><pubDate>Wed, 23 Apr 2008 10:33:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8418474</guid><dc:creator>Heejune</dc:creator><description>&lt;p&gt;Hello! Thanks for this puzzle, it was so fun. Okay, let me guess.. This assembly code looks like actually &amp;quot;reversing&amp;quot; the string which was given as third parameter(ebp+8). &lt;/p&gt;
&lt;p&gt;void myfun(char* szStr, int dummy, int dummy2)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	dummy = 0;&lt;/p&gt;
&lt;p&gt;	dummy2 = 0;&lt;/p&gt;
&lt;p&gt;	int strLength;&lt;/p&gt;
&lt;p&gt;	int LocalVar1;&lt;/p&gt;
&lt;p&gt;	char temp;&lt;/p&gt;
&lt;p&gt;	strLength = (int)strlen(szStr);&lt;/p&gt;
&lt;p&gt;	for (;strLength &amp;gt; 0;strLength--)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		LocalVar1 = 0;&lt;/p&gt;
&lt;p&gt;		do&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			if (LocalVar1 &amp;gt;= strLength -1)&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				break;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			if (*(szStr + LocalVar1) &amp;lt;= *(szStr + LocalVar1 + 1))	&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				continue;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			temp = *(szStr + LocalVar1);&lt;/p&gt;
&lt;p&gt;			*(szStr + LocalVar1) = *(szStr + LocalVar1 + 1);&lt;/p&gt;
&lt;p&gt;			*(szStr + LocalVar1+1) = temp;&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;		while (LocalVar1 ++);&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Heejune.&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8418490</link><pubDate>Wed, 23 Apr 2008 10:43:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8418490</guid><dc:creator>Heejune</dc:creator><description>&lt;p&gt;Oops! Sorry I posted wrong, old source code. following is a revised version, sorry for inconvenient.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;void myfun(char* szStr, int dummy, int dummy2)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	dummy = 0;&lt;/p&gt;
&lt;p&gt;	dummy2 = 0;&lt;/p&gt;
&lt;p&gt;	int strLength;&lt;/p&gt;
&lt;p&gt;	int LocalVar1;&lt;/p&gt;
&lt;p&gt;	char temp;&lt;/p&gt;
&lt;p&gt;	strLength = (int)strlen(szStr);&lt;/p&gt;
&lt;p&gt;	for (;strLength &amp;gt; 0;strLength--)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		LocalVar1 = 0;&lt;/p&gt;
&lt;p&gt;		for (;;LocalVar1 ++)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			if (LocalVar1 &amp;gt;= strLength -1)&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				break;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			if (*(szStr + LocalVar1) &amp;lt;= *(szStr + LocalVar1 + 1))	&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				continue;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			temp = *(szStr + LocalVar1);&lt;/p&gt;
&lt;p&gt;			*(szStr + LocalVar1) = *(szStr + LocalVar1 + 1);&lt;/p&gt;
&lt;p&gt;			*(szStr + LocalVar1+1) = temp;&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Heejune.&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8419016</link><pubDate>Wed, 23 Apr 2008 16:11:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8419016</guid><dc:creator>Miguel</dc:creator><description>&lt;p&gt;Nice blog. Its very interesting.&lt;/p&gt;
&lt;p&gt;And nice... &amp;#191;string reversing code? (I dont have free time enough for a in deep analisys)&lt;/p&gt;
&lt;p&gt;Im sorry, my english is very poor :o)&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8421536</link><pubDate>Thu, 24 Apr 2008 16:03:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8421536</guid><dc:creator>dmitri</dc:creator><description>&lt;p&gt;void charsort(char *buf)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	int len=strlen(buf);&lt;/p&gt;
&lt;p&gt;	for(int k=len;k&amp;gt;0;--k)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		for(int j=0;j&amp;lt;k-1;++j)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			if(buf[j]&amp;gt;buf[j+1]) &lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				char c=buf[j];&lt;/p&gt;
&lt;p&gt;				buf[j]=buf[j+1];&lt;/p&gt;
&lt;p&gt;				buf[j+1]=c;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8422322</link><pubDate>Thu, 24 Apr 2008 21:13:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8422322</guid><dc:creator>me</dc:creator><description>&lt;p&gt;How do you want to get the result of this? I have a C code which &amp;quot;almost&amp;quot; compiles to the same code. The stack locations for the automatic variables are not exactly the same, and sometimes, my compiler (MSVC6) uses different registers for the same thing.&lt;/p&gt;
&lt;p&gt;Should I post the code here?&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8422421</link><pubDate>Thu, 24 Apr 2008 21:47:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8422421</guid><dc:creator>me</dc:creator><description>&lt;p&gt;Oh, it seems this blog is moderated? So, I believe it is correct to send the code directly:&lt;/p&gt;
&lt;p&gt;Here it is (and I hope the formatting will survive the posting here):&lt;/p&gt;
&lt;p&gt;#include &amp;lt;string.h&amp;gt;&lt;/p&gt;
&lt;p&gt;void myfun(char * p, int n)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/* the stack layout is not exactly like the original */&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int i, j, k;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char buffer[160]; /*!&amp;lt; ununsed buffer */&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;i = strlen(p);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for ( j = i; j &amp;gt; 0; j-- )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for ( k = 0; k &amp;lt; j; k++ )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * Huh? Swap p[k] and p[k+1] if they are identical?&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * This does not make much sense, does it?&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( p[k] == p[k+1] )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c = p[k];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p[k] = p[k+1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p[k+1] = c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Now, what sense does this code have? IMHO, there is no sense at all. It goes through the input buffer pointed to by p and exchanges consecutive characters if they are equal. Additionally, it proceeds multiple times through the buffer.&lt;/p&gt;
&lt;p&gt;There is no sense at all.&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8423207</link><pubDate>Fri, 25 Apr 2008 04:46:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8423207</guid><dc:creator>Calin Iaru</dc:creator><description>&lt;p&gt;&amp;quot;Like a splinter in your mind&amp;quot; Morpheus&lt;/p&gt;
&lt;p&gt;It was a valuable exercise. I started by using an array instead of 4 local variables, and that added an extra call to _RTC_CheckStackVars.&lt;/p&gt;
&lt;p&gt;void myfun2(char *x) {&lt;/p&gt;
&lt;p&gt;int a, b, c;&lt;/p&gt;
&lt;p&gt;char d;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;c = strlen(x);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;a = c;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;for(;a &amp;gt; 0; a --) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;b = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for(;b &amp;lt; a - 1; b ++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(x[b] &amp;gt; x[b + 1]) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d = x[b];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;x[b] = x[b + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;x[b + 1] = d;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8423248</link><pubDate>Fri, 25 Apr 2008 05:23:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8423248</guid><dc:creator>tymsink</dc:creator><description>&lt;p&gt;myfun( pstr pStrParam )&lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// alphabetize pStrParam&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int nStrParamLength = strlen( pStrParam );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for( int nStrParamCurrent = nStrParamLength; nStrParamCurrent &amp;gt; 0; nStrParamCurrent-- )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for( int nStrParamIndex = 0; nStrParamCurrent - 1 &amp;lt; nStrParamIndex; ++nStrParamIndex )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if( pStrParam[ nStrParamIndex ] &amp;gt; pStrParam[ nStrParamIndex + 1 ] &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char cCurrent = pStrParam[ nStrParamIndex ]; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pStrParam[ nStrParamIndex ] = pStrParam[ nStrParamIndex + 1 ];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pStrParam[ nStrParamIndex + 1 ] = cCurrent;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8423621</link><pubDate>Fri, 25 Apr 2008 10:56:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8423621</guid><dc:creator>RichardRudek</dc:creator><description>&lt;p&gt;Here's the C code I reverse this into:&lt;/p&gt;
&lt;p&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;tchar.h&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;windows.h&amp;gt;&lt;/p&gt;
&lt;p&gt;void myfun(char *);&lt;/p&gt;
&lt;p&gt;int _tmain(int argc, _TCHAR* argv[])&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;char * pszData[80];&lt;/p&gt;
&lt;p&gt; &amp;nbsp;strcpy(pszData, &amp;quot;I don't even see the code anymore&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;printf(&amp;quot;Before: %s\n&amp;quot;, pszData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;myfun(pszData);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;printf(&amp;quot;After : %s\n&amp;quot;, pszData); &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;getchar();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return 0;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;void myfun(char * psz)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;char &amp;nbsp;ch;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int &amp;nbsp; i;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int &amp;nbsp; z1, z2;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;z1 = strlen(psz);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;for (z2=z1; z2 &amp;gt; 0; z2--)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for (i=0; i &amp;lt; z2-1; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (psz[i] &amp;gt; psz[i+1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= psz[i];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;psz[i] &amp;nbsp; &amp;nbsp;= psz[i+1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;psz[i+1] &amp;nbsp;= ch;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Which results in this:&lt;/p&gt;
&lt;p&gt;Before: I don't even see the code anymore&lt;/p&gt;
&lt;p&gt;After : &amp;nbsp; &amp;nbsp; &amp;nbsp; 'Iacddeeeeeeehmnnnooorsttvy&lt;/p&gt;
&lt;p&gt;Basically, it in-place sorts the characters.&lt;/p&gt;
&lt;p&gt;Here another test:&lt;/p&gt;
&lt;p&gt;Before: AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz&lt;/p&gt;
&lt;p&gt;After : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&lt;/p&gt;
&lt;p&gt;Now I wonder how Phoenix would have done...&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8424237</link><pubDate>Fri, 25 Apr 2008 18:25:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8424237</guid><dc:creator>Guaito</dc:creator><description>&lt;p&gt;I guess that the C++ code should be something like the following:&lt;/p&gt;
&lt;p&gt;void myfun(TCHAR * szString)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; int iCount;&lt;/p&gt;
&lt;p&gt; int iCount2;	&lt;/p&gt;
&lt;p&gt; int iLen;&lt;/p&gt;
&lt;p&gt; TCHAR cApp;&lt;/p&gt;
&lt;p&gt; iLen = strlen(szString);&lt;/p&gt;
&lt;p&gt; for (iCount = iLen;iCount &amp;gt; 0;iCount--)&lt;/p&gt;
&lt;p&gt; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;for (iCount2 = 0;iCount2 &amp;lt; (iCount -1);iCount2++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; if (szString[iCount2] &amp;gt; szString[iCount2 + 1])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; {	&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;cApp = szString[iCount2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;szString[iCount2] = szString[iCount2 + 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;szString[iCount2 + 1] = cApp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; }	&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;I think that the function should reverse the string passed as an agument.&lt;/p&gt;
&lt;p&gt;I think that there is an error, the line :&lt;/p&gt;
&lt;p&gt;if (szString[iCount2] &amp;gt; szString[iCount2 + 1])&lt;/p&gt;
&lt;p&gt;shuld be&lt;/p&gt;
&lt;p&gt;if (szString[iCount2] != szString[iCount2 + 1])&lt;/p&gt;
&lt;p&gt;In ASM &amp;nbsp;the Line &lt;/p&gt;
&lt;p&gt;32 00cc14f6 7e28 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jle &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa0 (00cc1520)&lt;/p&gt;
&lt;p&gt;Shuld be&lt;/p&gt;
&lt;p&gt;32 00cc14f6 7428 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jz &amp;nbsp; &amp;nbsp; puzzler3!myfun+0xa0 (00cc1520)&lt;/p&gt;
&lt;p&gt;Guaito&lt;/p&gt;</description></item><item><title>re: NTDebugging Puzzler 0x00000003 (Matrix Edition) Some assembly required.</title><link>http://blogs.msdn.com/ntdebugging/archive/2008/04/21/ntdebugging-puzzler-0x00000003-matrix-addition-some-assembly-required.aspx#8426655</link><pubDate>Sat, 26 Apr 2008 11:44:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8426655</guid><dc:creator>me</dc:creator><description>&lt;p&gt;Oh... I read the JLE wrong. Yes, it makes more sense if the variables are not identical. ;) And there were some other &amp;quot;minor&amp;quot; errors.&lt;/p&gt;
&lt;p&gt;I must admit I undid the compilation in the train with paper and pencil. I might have spotted this error if I did it on the computer.&lt;/p&gt;
&lt;p&gt;And: I must tell that the debug build reveals much of the original structure.&lt;/p&gt;
&lt;p&gt;Anyway, I am still puzzled why the compiler generated this stack frame in this way. Is it because it is C++ and I missed something important? Is it any &amp;quot;anti-malware&amp;quot; aspect of the newer compilers?&lt;/p&gt;</description></item></channel></rss>