<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pamiętnik programisty &#187; asm</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/asm/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Wed, 28 Dec 2011 23:52:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Tworzenie okienka w asm</title>
		<link>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 12:08:45 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[winapi]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=244</guid>
		<description><![CDATA[Wiadomo że stworzenie okienka przy wykorzystaniu języka C i WinAPI nie jest zadaniem trudnym. Nawet w dokumentacji od MS można znaleźć gotowy przykład. Jest to natomiast zadanie bardzo żmudne i z reguły z pełnym zrozumieniem pól i dopuszczalnych wartości dla wymaganych struktur robi się to tylko raz. Potem albo się kopiuje gotowy standardowy kod wprowadzając [...]]]></description>
			<content:encoded><![CDATA[<p>Wiadomo że stworzenie okienka przy wykorzystaniu języka C i WinAPI nie jest zadaniem trudnym. Nawet w dokumentacji od MS można znaleźć gotowy przykład. Jest to natomiast zadanie bardzo żmudne i z reguły z pełnym zrozumieniem pól i dopuszczalnych wartości dla wymaganych struktur robi się to tylko raz. Potem albo się kopiuje gotowy standardowy kod wprowadzając tylko pewne czasami zmiany odbiegającego od typowego zastosowania, albo przyjmuje że &#8222;się umie&#8221; i &#8222;zna fundament&#8221; i przesiada na WindowsForms. Ale można pójść w drugą stronę, stworzyć okienko w assmeblerze i tym samym uzyskać miano rycerza hardcoru.<span id="more-244"></span></p>
<p>Może dziwić ale zbudowanie okna korzystając z języka maszynowego nie jest trudno. Objętość programu jest zbliżona do tego utworzonego standardowo z wykorzystaniem C. Ponadto korzystając z kompilatora dostarczonego przez Microsoft (MASM) istnieje możliwość bardzo łatwego dostępu do funkcji API systemu Windows. Ponad to kompilator dostarcza wiele ułatwiających życie makr.</p>
<p>[cc lang="asm"]<br />
.386<br />
.model flat,stdcall<br />
option casemap:none<br />
include		c:\masm32\include\windows.inc<br />
include 	c:\masm32\include\user32.inc<br />
includelib	c:\masm32\lib\user32.lib<br />
include		c:\masm32\include\kernel32.inc<br />
includelib	c:\masm32\lib\kernel32.lib</p>
<p>WinMain proto <img src='http://piotr.doniec.eu/devlog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> WORD,:DWORD,:DWORD,:DWORD</p>
<p>.data	; zainicjalizowanie zmienne<br />
	ClassName db &#8222;SimpleWinClass&#8221;,0<br />
	AppName db &#8222;Our first Window&#8221;,0<br />
.data?	; niezainicjalizowane zmienne<br />
	hInstance HINSTANCE ?<br />
	CommandLine LPSTR	?<br />
.code<br />
	start:<br />
		invoke GetModuleHandle,NULL<br />
		mov hInstance,eax<br />
		invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT<br />
		invoke ExitProcess,0</p>
<p>WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD<br />
	LOCAL wc:WNDCLASSEX<br />
	LOCAL msg:MSG<br />
	LOCAL hwnd:HWND</p>
<p>	mov wc.cbSize,SIZEOF WNDCLASSEX<br />
	mov wc.style,CS_HREDRAW or CS_VREDRAW<br />
	mov wc.lpfnWndProc,OFFSET WndProc<br />
	mov wc.cbClsExtra,NULL<br />
	mov wc.cbWndExtra,NULL<br />
	push hInstance<br />
	pop wc.hInstance<br />
	mov wc.hbrBackground,COLOR_WINDOW+1<br />
	mov wc.lpszMenuName,NULL<br />
	mov wc.lpszClassName, OFFSET ClassName<br />
	invoke LoadIcon,NULL,IDI_APPLICATION<br />
	mov wc.hIcon,eax<br />
	mov wc.hIconSm,eax<br />
	invoke LoadCursor,NULL,IDC_ARROW<br />
	mov wc.hCursor,eax<br />
	invoke RegisterClassEx,addr wc<br />
	invoke CreateWindowEx,NULL,\<br />
                ADDR ClassName,\<br />
                ADDR AppName,\<br />
                WS_OVERLAPPEDWINDOW,\<br />
                CW_USEDEFAULT,\<br />
                CW_USEDEFAULT,\<br />
                CW_USEDEFAULT,\<br />
                CW_USEDEFAULT,\<br />
                NULL,\<br />
                NULL,\<br />
                hInst,\<br />
                NULL<br />
    mov hwnd,eax<br />
    invoke ShowWindow,hwnd,CmdShow<br />
    invoke UpdateWindow,hwnd    </p>
<p>    .WHILE TRUE<br />
    	invoke GetMessage,ADDR msg,NULL,0,0<br />
    	.BREAK .IF(!eax)<br />
    	invoke TranslateMessage,ADDR msg<br />
    	invoke DispatchMessage,ADDR msg<br />
    .ENDW</p>
<p>    mov eax,msg.wParam<br />
	ret</p>
<p>WinMain endp</p>
<p>WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM</p>
<p>	.IF uMsg==WM_DESTROY<br />
		invoke PostQuitMessage,NULL<br />
	.ELSE<br />
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam<br />
		ret<br />
	.ENDIF<br />
	xor eax,eax<br />
	ret</p>
<p>WndProc endp</p>
<p>	end start</p>
<p>[/cc]</p>
<p>Nie ma co wiele tłumaczyć. Kod jaki jest interpretowany przez MASM wygląda już niemalże jak język wysokiego poziomu(niektórzy mówią że C to język niskiego poziomu, ale to dlatego że nie umieli znaleźć określenia dla Javy, C# itp.) Bardzo fajnym makrem jest <code>invoke</code> uruchamiające zadaną procedurę i umożliwiające podanie listy argumentów poprzez rozdzielenie przecinkiem. Bardzo przyjemna alternatywa dla push&#8217;owania w odwrotnej kolejności.<br />
Jedyny wniosek jaki można wysnuć to to że jeżeli ktoś umie programować z wykorzystaniem WinAPI w C, to i bez problemu zastosuje go w assemblerze. Oczywiście nie ma obowiązku korzystania z MASM, do API można się także dostać korzystać z innych assemblerów np. NASM ( polacam zapoznanie się z nasmx).</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

